使用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,使其不为主键即可。