MYSQL無重復插入數據更新語法&sql一句話使insert時若主鍵重復則更新

MYSQL無重復插入數據更新語法&sql一句話使insert時若主鍵重復則更新

 

如果你指定瞭ON DUPLICATE KEY UPDATE命令語句,那麼在唯一索引或者主索引的作用下將不插入與數據庫記錄重復的內容,但同時會更新數據庫中的舊記錄。例如,字段a被聲明為唯一索引並且裡面隻包含有值為1的記錄,以下兩個語句會達到同樣的效果:

  www.aiwalls.com  

一、 INSERT INTO table ( a , b , c ) VALUES ( 1 , 2 , 3 ) 

   ON DUPLICATE KEY UPDATE c = c + 1 ;

 

二、 UPDATE table SET c = c + 1 WHERE a = 1 ;

受影響的是a=1的行,當插入時c的值加1。

如果字段b也是唯一的話,這個插入語句將和以下語句的效果一樣:

UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

如果a=1 OR b=2匹配瞭不止一行,也隻是第一行被更新。一般地,如果表中有多個唯一索引的話,你應該避免在使用用ON DUPLICATE KEY子句。
 

你可以在插入更新語句 INSERT … UPDATE 中使用 VALUES(字段名) 函數去關聯某一行記錄。也就是說, VALUES(字段名) 可以用在UPDATE語句中去更新某字段的值而不會出現重復鍵。這個函數在多行插入中尤其有用。但是函數 VALUES() 僅當用在 INSERT … UPDATE 語句中才有意義,否則會返回NULL。例如:

 

INSERT INTO table ( a , b , c ) VALUES ( 1 , 2 , 3 ) , ( 4 , 5 , 6 ) 

ON DUPLICATE KEY UPDATE c = VALUES ( a ) + VALUES ( b ) ;

這個語句和下面兩個是同效果的:

  www.aiwalls.com  

INSERT INTO table ( a , b , c ) VALUES ( 1 , 2 , 3 ) 

ON DUPLICATE KEY UPDATE c = 3 ;

INSERT INTO table ( a , b , c ) VALUES ( 4 , 5 , 6 ) 

ON DUPLICATE KEY UPDATE c = 9 ;

如果表中包含有一個自動遞增字段AUTO_INCREMENT,並用 INSERT … UPDATE插入一行,函數 LAST_INSERT_ID()會返回AUTO_INCREMENT的值,如果這個語句更新某一行, LAST_INSERT_ID() 就沒有意義瞭。但是,你可以通過用 LAST_INSERT_ID(expr)使它變得有意義,假如id字段是自動遞增欄的話,使 LAST_INSERT_ID() 對更新語句有意義的方法如下:

 

INSERT INTO table ( a , b , c ) VALUES ( 1 , 2 , 3 ) 

ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID ( id ) , c = 3 ;

如果你使用 ON DUPLICATE KEY UPDATE 語句的話,延遲執行選項 DELAYED 將被忽略。

 

英文原文地址:https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

 

其它聲音:

  www.aiwalls.com  

插入記錄

 

Insert into table_name (field_name1, field_name2, …) values (value1, value2, …);

 

Insert into values (value1, value2, …);   //這種形式隻能應用於值的順序與字段順序匹配的情況(可以通過調用describe命令來決定字段順序)。

包含引用標志的值需要再引號’前面加上反斜線                   //轉義字符

註意:into 關鍵字是可選的
 

也可以同時插入多個值,用逗號分開

Eg:insert table_name values (value1, value2, …), (value3, value4, …);

還可以不使用insert… values格式,而使用類似update語句,它使用set子句分別為每一列設置值。

Insert into table_name set field_name1 = value1, field_name2 = value2,…;

使用default值

Create table table_name (field_name1 type default def_value not null,…);

Insert table_name values (default,…);   //default關鍵字隻在4.0.3以及更高版本才支持
 

使用AUTOINCREMENT字段

自動產生下一個序號,該字段必須被設置為主鍵

使用UNIQUE字段

使用IGNORE關鍵字或者ON DUPLICATE KEY UPDATE子句跳過INSERT、中斷操作或者更新舊記錄為新值。  www.aiwalls.com  

INSERT IGNORE INTO TABLE_NAME (UNIQUE_FIELD, …) VALUES (REPEAT, …);

如果重復記錄,則不會報告錯誤,也不會更新記錄,數據庫中的數據保持不變。

ON DUPLICATE KEY UPDATE和REPLACE區別:前者隻把已命名的字段更新為新值,後者刪除瞭舊記錄,然後用新值完全替換。
 

Eg:insert into Menu value (null, ‘MySQL’, ‘www.mysql.com’) on duplicate key update label=’MS SQL’, url=’www.microsoft.com’;

在這種情況下,如果MySQL發現表中已經包含具有相同唯一鍵的記錄,則會自動更新舊的記錄為ON DUPLICATE KEY UPDATE從句中指定的新值。

當有很多insert語句需要被順序執行時,IGNORE關鍵字就使操作變得很方便。這可以保證不管拿一個INSERT包含瞭重復值,MySQL都會跳過而不放棄全部操作。

發佈留言