mysql插入數據時 insert IGNORE、ON DUPLICATE KEY UPDATE、replace into

 

轉:html

mysql insert時幾個操做DELAYED 、IGNORE、ON DUPLICATE KEY UPDATE的區別

zccst整理

1、DELAYED的使用

使用延遲插入操做

DELAYED調節符應用於INSERT和REPLACE語句。當DELAYED插入操做到達的時候,服務器把數據行放入一個隊列中,並當即給客戶端返回一個狀態信息,這樣客戶端就能夠在數據表被真正地插入記錄以前繼續進行操做了。若是讀取者從該數據表中讀取數據,隊列中的數據就會被保持着,直到沒有讀取者爲止。接着服務器開始插入延遲數據行(delayed-row)隊列中的數據行。在插入操做的同時,服務器還要檢查是否有新的讀取請求到達和等待。若是有,延遲數據行隊列就被掛起,容許讀取者繼續操做。當沒有讀取者的時候,服務器再次開始插入延遲的數據行。這個過程一直進行,直到隊列空了爲止。

幾點要注意事項:
· INSERT DELAYED應該僅用於指定值清單的INSERT語句。服務器忽略用於INSERT DELAYED...SELECT語句的DELAYED。
· 服務器忽略用於INSERT DELAYED...ON DUPLICATE UPDATE語句的DELAYED。
· 由於在行被插入前,語句馬上返回,因此您不能使用LAST_INSERT_ID()來獲取AUTO_INCREMENT值。AUTO_INCREMENT值可能由語句生成。
· 對於SELECT語句,DELAYED行不可見,直到這些行確實被插入了爲止。
· DELAYED在從屬複製服務器中被忽略了,由於DELAYED不會在從屬服務器中產生與主服務器不同的數據。

注意,目前在隊列中的各行只保存在存儲器中,直到它們被插入到表中爲止。這意味着,若是您強行停止了mysqld(例如,使用kill -9)或者若是mysqld意外中止,則全部沒有被寫入磁盤的行都會丟失。



2、IGNORE的使用

IGNORE是MySQL相對於標準SQL的擴展。若是在新表中有重複關鍵字,或者當STRICT模式啓動後出現警告,則使用IGNORE控制ALTER TABLE的運行。若是沒有指定IGNORE,當重複關鍵字錯誤發生時,複製操做被放棄,返回前一步驟。若是指定了IGNORE,則對於有重複關鍵字的行,只使用第一行,其它有衝突的行被刪除。而且,對錯誤值進行修正,使之儘可能接近正確值。

insert ignore into tb(...) value(...)

這樣不用校驗是否存在了,有則忽略,無則添加



3、ON DUPLICATE KEY UPDATE的使用
MySQL 自4.1版之後開始支持INSERT … ON DUPLICATE KEY UPDATE語法,使得本來須要執行3條SQL語句(SELECT,INSERT,UPDATE),縮減爲1條語句便可完成。

例如ipstats表結構以下:
引用
CREATE TABLE ipstats (
  ip VARCHAR(15) NOT NULL UNIQUE,
  clicks SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0'
);

本來須要執行3條SQL語句,以下:

IF (SELECT * FROM ipstats WHERE ip='192.168.0.1') {
UPDATE ipstats SET clicks=clicks+1 WHERE ip='192.168.0.1';
} else {
INSERT INTO ipstats (ip, clicks) VALUES ('192.168.0.1', 1);
}

而如今只需下面1條SQL語句便可完成:

INSERT INTO ipstats VALUES('192.168.0.1', 1) ON DUPLICATE KEY UPDATE clicks=clicks+1;

注意,要使用這條語句,前提條件是這個表必須有一個惟一索引或主鍵。

mysql> create table i (id int unique, co int);
mysql> insert into i values (1,1),(2,1);
mysql> insert into i values (1,1) on duplicate key update co=co+1;
mysql> select * from i;
+------+------+
| id   | co    |
+------+------+
|    1 |    2 |
|    2 |    1 |
+------+------+

//若是再執行一次insert into i values (1,1) on duplicate key update co=co+1;則結果爲:
mysql> select * from i;
+------+------+
| id   | co    |
+------+------+
|    1 |    3 |
|    2 |    1 |
+------+------+

//經測試,id爲主鍵時也可行,與unique時同樣
create table i (id int auto_increment primary key, co int);

4、三者之間區別
DELAYED   作爲快速插入,並非很關心失效性,提升插入性能。

ignore    只關注主鍵對應記錄是不存在,無則添加,有則忽略。

ON DUPLICATE KEY UPDATE 在添加時操做,關注非主鍵列,注意與ignore的區別。有則更新指定列,無則添加。mysql

 

----------------------sql

轉:服務器

MySQL中的insert ignore into, replace into等的一些用法總結

MySQL replace into 有三種形式:post

1. replace into tbl_name(col_name, ...) values(...)性能

2. replace into tbl_name(col_name, ...) select ...測試

3. replace into tbl_name set col_name=value, ...spa

 

1.insert ignore intohtm

當插入數據時,如出現錯誤時,如重複數據,將不返回錯誤,只以警告形式返回。因此使用ignore請確保語句自己沒有問題,不然也會被忽略掉。例如:blog

INSERT IGNORE INTO books (name) VALUES ('MySQL Manual')

2.on duplicate key update

當primary或者unique重複時,則執行update語句,如update後爲無用語句,如id=id,則同1功能相同,但錯誤不會被忽略掉。例如,爲了實現name重複的數據插入不報錯,可以使用一下語句:

INSERT INTO books (name) VALUES ('MySQL Manual') ON duplicate KEY UPDATE id = id

3.insert … select … where not exist

根據select的條件判斷是否插入,能夠不光經過primary 和unique來判斷,也可經過其它條件。例如:

INSERT INTO books (name) SELECT 'MySQL Manual' FROM dual WHERE NOT EXISTS (SELECT id FROM books WHERE id = 1)

4.replace into

若是存在primary or unique相同的記錄,則先刪除掉。再插入新記錄。

REPLACE INTO books SELECT 1, 'MySQL Manual' FROM books

相關文章
相關標籤/搜索