溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MYSQL無重復(fù)插入數(shù)據(jù)更新語法的示例分析

發(fā)布時間:2021-10-13 15:28:08 來源:億速云 閱讀:149 作者:柒染 欄目:數(shù)據(jù)庫

MYSQL無重復(fù)插入數(shù)據(jù)更新語法的示例分析,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。


 
如果你指定了ON DUPLICATE KEY UPDATE命令語句,那么在唯一索引或者主索引的作用下將不插入與記錄重復(fù)的內(nèi)容,但同時會更新數(shù)據(jù)庫中的舊記錄。例如,字段a被聲明為唯一索引并且里面只包含有值為1的記錄,以下兩個語句會達(dá)到同樣的效果:
  www.2cto.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的行,當(dāng)插入時c的值加1。
如果字段b也是唯一的話,這個插入語句將和以下語句的效果一樣:
UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
如果a=1 OR b=2匹配了不止一行,也只是第一行被更新。一般地,如果表中有多個唯一索引的話,你應(yīng)該避免在使用用ON DUPLICATE KEY子句。
 
你可以在插入更新語句 INSERT ... UPDATE 中使用 VALUES(字段名) 函數(shù)去關(guān)聯(lián)某一行記錄。也就是說, VALUES(字段名) 可以用在UPDATE語句中去更新某字段的值而不會出現(xiàn)重復(fù)鍵。這個函數(shù)在多行插入中尤其有用。但是函數(shù) VALUES() 僅當(dāng)用在 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.2cto.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插入一行,函數(shù) 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 語句的話,延遲執(zhí)行選項 DELAYED 將被忽略。
 
插入記錄
 
Insert into table_name (field_name1, field_name2, …) values (value1, value2, …);
 
Insert into values (value1, value2, …);   //這種形式只能應(yīng)用于值的順序與字段順序匹配的情況(可以通過調(diào)用describe命令來決定字段順序)。
包含引用標(biāo)志的值需要再引號’前面加上反斜線                   //轉(zhuǎn)義字符
注意:into 關(guān)鍵字是可選的
 
也可以同時插入多個值,用逗號分開
Eg:insert table_name values (value1, value2, …), (value3, value4, …);
還可以不使用insert… values格式,而使用類似update語句,它使用set子句分別為每一列設(shè)置值。
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關(guān)鍵字只在4.0.3以及更高版本才支持
 
使用AUTOINCREMENT字段
自動產(chǎn)生下一個序號,該字段必須被設(shè)置為主鍵
使用UNIQUE字段
使用IGNORE關(guān)鍵字或者ON DUPLICATE KEY UPDATE子句跳過INSERT、中斷操作或者更新舊記錄為新值。  www.2cto.com  
INSERT IGNORE INTO TABLE_NAME (UNIQUE_FIELD, …) VALUES (REPEAT, …);
如果重復(fù)記錄,則不會報告錯誤,也不會更新記錄,數(shù)據(jù)庫中的數(shù)據(jù)保持不變。
ON DUPLICATE KEY UPDATE和REPLACE區(qū)別:前者只把已命名的字段更新為新值,后者刪除了舊記錄,然后用新值完全替換。
 
Eg:insert into Menu value (null, ‘MySQL’, ‘www.mysql.com’) on duplicate key update label=’MS SQL’, url=’www.microsoft.com’;
在這種情況下,如果MySQL發(fā)現(xiàn)表中已經(jīng)包含具有相同唯一鍵的記錄,則會自動更新舊的記錄為ON DUPLICATE KEY UPDATE從句中指定的新值。
當(dāng)有很多insert語句需要被順序執(zhí)行時,IGNORE關(guān)鍵字就使操作變得很方便。這可以保證不管拿一個INSERT包含了重復(fù)值,MySQL都會跳過而不放棄全部操作。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI