insert的语法 INSERT [ LOW_PRIORITY | DELAYED | HIGH_PRIORITY ] [ IGNORE ] [ INTO ] tbl_name [ (col_name,...) ] VALUES ({expr | DEFAULT },...),(...),... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ] 或: INSERT [ LOW_PRIORITY | DELAYED | H
insert的语法
INSERT [ LOW_PRIORITY | DELAYED | HIGH_PRIORITY ] [ IGNORE ] [ INTO ] tbl_name [ (col_name,...) ] VALUES ({expr | DEFAULT },...),(...),... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ] 或: INSERT [ LOW_PRIORITY | DELAYED | HIGH_PRIORITY ] [ IGNORE ] [ INTO ] tbl_name SET col_name = {expr | DEFAULT }, ... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ] 或: INSERT [ LOW_PRIORITY | HIGH_PRIORITY ] [ IGNORE ] [ INTO ] tbl_name [ (col_name,...) ] SELECT ... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
如果列清单和 VALUES 清单均为空清单,则 INSERT 会创建一个行,每个列都被设置为默认值:
INSERT INTO tbl_name () VALUES ();
假设worker表只有name和email,插入一条数据
insert into worker values (“tom”,”tom @yahoo .com”);
批量插入多条数据
insert into worker values (‘tom’,’tom @yahoo .com’),(‘paul’,’paul @yahoo .com’);
给出要赋值的那个列,然后再列出值的插入数据
insert into worker (name) values (‘tom’); insert into worker (name) values (‘tom’), (‘paul’);
使用set插入数据
insert into worker set name = ’tom’;
在 SET 子句中未命名的行都赋予一个缺省值,使用这种形式的 INSERT 语句不能插入多行。
一个expression可以引用在一个值表先前设置的任何列,例如
INSERT INTO tbl_name (col1,col2) VALUES ( 15 ,col1 * 2 ); -- 但不能这样 INSERT INTO tbl_name (col1,col2) VALUES (col2 * 2 , 15 );
使用INSERT…SELECT语句插入从其他表选择的行
insert into tbl_name1(col1,col2) select col3,col4 from tbl_name2; -- 如果每一列都有数据 insert into tbl_name1 select col3,col4 from tbl_name2;
查询不能包含一个ORDER BY子句,而且 INSERT语句的目的表不能出现在SELECT查询部分的FROM子句.
ON DUPLICATE KEY UPDATE
如果您指定了 ON DUPLICATE KEY UPDATE ,并且插入行后会导致在一个 UNIQUE 索引或 PRIMARY KEY 中出现重复值,则执行旧行 UPDATE 。
-- 假设a,b为唯一索引,表table没有1,2这样的行是正常插入数据,冲突时,更新c列的值 INSERT INTO table (a,b,c) VALUES ( 1 , 2 , 3 ) ON DUPLICATE KEY UPDATE c = 3 ; -- 或者是 INSERT INTO table (a,b,c) VALUES ( 1 , 2 , 3 ) ON DUPLICATE KEY UPDATE c = values (c); -- 引用其他列更新冲突的行 INSERT INTO table (a,b,c) VALUES ( 1 , 2 , 3 ),( 4 , 5 , 6 ) ON DUPLICATE KEY UPDATE c = VALUES (a) + VALUES (b);
向一个已定义为 NOT NULL 的列中插入 NULL 。对于一个多行 INSERT 语句或 INSERT INTO...SELECT 语句,根据列数据的类型,列被设置为隐含的默认值。对于数字类型,默认值为 0 ;对于字符串类型,默认值为空字符串 ( '' ) ;对于日期和时间类型,默认值为“ zero ”值。
INSERT INTO...SELECT的ON DUPLICATE KEY UPDATE
insert into tbl_name1(a,b,c) select col1,col2,col3 from tbl_name2 ON DUPLICATE KEY UPDATE c = values (c);
INSERT DELAYED
如果您的客户端不能等待 INSERT 完成,则这个选项是非常有用的, 当一个客户端使用 INSERT DELAYED 时,会立刻从服务器处得到一个确定。并且行被排入队列,当表没有被其它线程使用时,此行被插入。
使用 INSERT DELAYED 的另一个重要的好处是,来自许多客户端的插入被集中在一起,并被编写入一个块。这比执行许多独立的插入要快很多。
INSERT DELAYED INTO worker (name) values (‘tom’), (‘paul’);
使用 DELAYED 时有一些限制:
INSERT DELAYED 仅适用于 MyISAM, MEMORY 和 ARCHIVE 表。对于 MyISAM 表,如果在数据文件的中间没有空闲的块,则支持同时采用 SELECT 和 INSERT 语句。在这些情况下,基本不需要对 MyISAM 使用 INSERT DELAYED 。 INSERT DELAYED 应该仅用于指定值清单的 INSERT 语句。服务器忽略用于 INSERT DELAYED...SELECT 语句的 DELAYED和 INSERT DELAYED...ON DUPLICATE UPDATE 语句的 DELAYED 。 因为在行被插入前,语句立刻返回,所以您不能使用 LAST_INSERT_ID() 来获取 AUTO_INCREMENT 值。 AUTO_INCREMENT 值可能由语句生成。 对于 SELECT 语句, DELAYED 行不可见,直到这些行确实被插入了为止。 DELAYED 在从属复制服务器中被忽略了,因为 DELAYED 不会在从属服务器中产生与主服务器不一样的数据。