使用INSERT INTO 插入数据是,除了使用INSERT INTO TABLE_NAME FIELD1,FIELD2..VALUES (VALUE1,VALUE2...)这个语句之外,还可以使用另一种写法。

创建一个表,我们用来举例

CREATE TABLE ld (
  id int(11) NOT NULL,
  name varchar(20) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB;

首先是SELECT 语句,SELECT语句的传统写法规则我们这里不用介绍,只介绍我们需要的。

SELECT ATTRIBUTE1 ATTRIBUTE2 ... FROM TABLE_NAME;

SELECT id,name FROM ld;

1	张三
2	lisi
3	lisiS

FIEDL1,FIELD2为表的字段,当指定的字段不在表中,会报错。

SELECT id,namename FROM ld
> 1054 - Unknown column 'namename' in 'field list'
> Time: 0s

但是当指定的是数字或字符串,则不会报错,而是输出以数字或字符串为字段名,值为数字或字符串的行,行的数量是原来表中已有的行数。如果没有指定相应的表,则会输出以数字或字符串为字段名,值为数字或字符串的一行数据,

SELECT 123,'namemame','456' FROM ld;

123	namemame	456
123	namemame	456
123	namemame	456

结合:

INSERT INTO TABLE_NAME SELECT VALUE1 VALUE2;

INSERT INTO ld SELECT 99,'LD'
> Affected rows: 1
> Time: 0.121s

注意VALUE1 ,VALUE2值为TABLE_NAME的属性类型的值,才可以执行成功,

INSERT INTO ld SELECT 'DD','LD'
> 1366 - Incorrect integer value: 'DD' for column 'id' at row 1
> Time: 0.001s

但是以纯数字组成的字符串,可以看做是INT 类型。

INSERT INTO ld SELECT '66','LD'
> Affected rows: 1
> Time: 0.109s

最终表的数据为:

SELECT * FROM ld;

1	张三
2	lisi
3	lisiS
66	LD
99	LD

注意:有一种从多个表中组合字段到另一个表中的写法,即表的复制,语法格式为:

INSERT INTO TABLE1_NAME ( FIELD1,FIELD2...) SELECT FIELD1,FIELD2... FROM TABLE2_NAME;使用两个表,多个表不适用,

当两个表的结构相同时,直接插入数据即可,可以写成这样:

INSERT INTO TABLE1_NAME SELECT * FROM TABLE2_NAME;

当连个表的结构不同时,需要指定插入的列,同时表1表2必须包含相同类型和字段大小的字段:

INSERT INTO TABLE1_NAME (FIELD1,FIELD2) SELECT FIELD1,FIELD2 FROM TABLE1_NAME;

注意:TABLE_NAME1 必须存在,FIELD1,FIELD2也必须存在,若TABLE_NAME1有主键且不具备自动增长,则FIELD1,FIELD2…中必须包括主键。

 

思考:

INSERT INTO LD(id,name) SELECT id,name FROM LD;

这个语句能够将LD的数据复制,然后再插入到LD表中?

答:不能,因为它复制了表中的数据,但是LD表中的id是主键,不能重复,所以不会成功,如果想实现复制自身,则修改id,使其不为主键即可。