首頁  >  文章  >  資料庫  >  解析mysql中insert的操作

解析mysql中insert的操作

怪我咯
怪我咯原創
2017-04-01 10:03:281357瀏覽

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時有一些限制:
1.INSERT DELAYED僅適用於MyISAM, MEMORY和ARCHIVE表。對於MyISAM表,如果在資料檔案的中間沒有空閒的區塊,則支援同時採用SELECT和INSERT語句。在這些情況下,基本上不需要對MyISAM使用INSERT DELAYED。

2.INSERT DELAYED應該只用於指定值清單的INSERT語句。伺服器忽略用於INSERT DELAYED...SELECT語句的DELAYED和INSERT DELAYED...ON DUPLICATE UPDATE語句的DELAYED。

3.因為在行被插入前,語句立刻傳回,所以您不能使用LAST_INSERT_ID()來取得AUTO_INCREMENT值。 AUTO_INCREMENT值可能由語句產生。

4.對於SELECT語句,DELAYED行不可見,直到這些行確實被插入了為止。

5.DELAYED在從屬複製伺服器中被忽略了,因為DELAYED不會在從屬伺服器產生與主伺服器不一樣的資料。

以上是解析mysql中insert的操作的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn