INSERT 语句具有几种形式:
可指定所有列的值:
例如:
shell> mysql –u root –p
mysql> use mytest;
mysql> insert into worker values(“tom”,”tom@yahoo.com”);
“INTO”一词自 MySQL 3.22.5 以来是可选的。(这一点对其他形式的 INSERT 语句也成立。)VALUES 表必须包含表中每列的值,并且按表中列的存放次序给出。(一般,这就是创建表时列的定义次序。如果不能肯定的话,可使用 DESCRIBE tbl_name 来查看这个次序。)
使用多个值表,可以一次提供多行数据。
Mysql>insert into worker values(‘tom’,’tom@yahoo.com’),(‘paul’,’paul@yahoo.com’);
有多个值表的INSERT ... VALUES的形式在MySQL 3.22.5或以后版本中支持。
可以给出要赋值的那个列,然后再列出值。这对于希望建立只有几个列需要初始设置的记录是很有用的。
例如:
mysql>insert into worker (name) values (‘tom’);
自MySQL 3.22.5 以来,这种形式的 INSERT 也允许多个值表:
mysql>insert into worker (name) values (‘tom’), (‘paul’);
在列的列表中未给出名称的列都将赋予缺省值。
自MySQL 3.22 .10 以来,可以 col_name = value 的形式给出列和值。
例如:
mysql>insert into worker set name=’tom’;
在SET 子句中未命名的行都赋予一个缺省值。
使用这种形式的 INSERT 语句不能插入多行。
一个expression可以引用在一个值表先前设置的任何列。例如,你能这样:
mysql> INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);
但不能这样:
mysql> INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);
使用INSERT…SELECT语句插入从其他表选择的行
当我们在上一节学习创建表时,知道可以使用select从其它表来直接创建表,甚至可以同时复制数据记录。如果你已经拥有了一个表,你同样可以从select语句的配合中获益。
从其它表中录入数据,例如:
mysql>insert into tbl_name1(col1,col2) select col3,col4 from tbl_name2;
你也可以略去目的表的列列表,如果你每一列都有数据录入。
mysql>insert into tbl_name1 select col3,col4 from tbl_name2;
INSERT INTO ... SELECT语句满足下列条件:
查询不能包含一个ORDER BY子句。
INSERT语句的目的表不能出现在SELECT查询部分的FROM子句,因为这在ANSI SQL中被禁止让从你正在插入的表中SELECT。(问题是SELECT将可能发现在同一个运行期间内先前被插入的记录。当使用子选择子句时,情况能很容易混淆)
使用replace、replace…select语句插入
REPLACE功能与INSERT完全一样,除了如果在表中的一个老记录具有在一个唯一索引上的新记录有相同的值,在新记录被插入之前,老记录被删除。对于这种情况,insert语句的表现是产生一个错误。
REPLACE语句也可以和SELECT相配合,所以上两小节的内容完全适合REPALCE。
应该注意的是,由于REPLACE语句可能改变原有的记录,因此使用时要小心。