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

若是你指定了ON DUPLICATE KEY UPDATE命令語句,那麼在惟一索引或者主索引的做用下將插入與數據庫記錄重複的內容,但同時會更新數據庫中的舊記錄。例如,字段a被聲明爲惟一索引而且裏面只包含有值爲1的記錄,如下兩個語句會達到一樣的效果:html

1、 INSERT INTO table ( a , b , c ) VALUES ( 1 , 2 , 3 )
  
ON DUPLICATE KEY UPDATE c = c + 1 ;

2、
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。例如:mysql

INSERT INTO table ( a , b , c ) VALUES ( 1 , 2 , 3 ) , ( 4 , 5 , 6 )
ON DUPLICATE KEY UPDATE c = VALUES ( a ) + VALUES ( b ) ;

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

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 將被忽略。函數

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

其它聲音:spa

插入記錄htm

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、中斷操做或者更新舊記錄爲新值。
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都會跳過而不放棄所有操做。table

相關文章
相關標籤/搜索