在編寫程序時,我們經常會遇到一些基於條件判斷的邏輯,比如:判斷該條數據是否已經在數據庫中存在,如果不存在,則插入。
技巧一:使用ignore關鍵字
如果是用主鍵primary或者唯一索引unique區分了記錄的唯一性,避免重復插入記錄可以使用: insert ignore into
當插入數據時,如出現錯誤時,如重復數據,將不返回錯誤,只以警告形式返回。所以使用ignore請確保語句本身沒有問題,否則也會被忽略掉。
示例: INSERT IGNORE INTO books ( name ) VALUES ( 'MySQL Manual' )
技巧二:使用replace into
REPLACE的運行與INSERT很相像, 但是如果舊記錄與新記錄有相同的值,則在新記錄被插入之前,舊記錄被刪除,即:嘗試把新行插入到表中,當因為對於主鍵或唯一關鍵字出現重復關鍵字錯誤而造成插入失敗時從表中刪除含有重復關鍵字值的沖突行,再次嘗試把新行插入到表中。
舊記錄與新記錄有相同的值的判斷標准就是:表有一個PRIMARY KEY或UNIQUE索引,否則,使用一個REPLACE語句沒有意義。該語句會與INSERT相同,因為沒有索引被用於確定是否新行復制了其它的行。
語法格式:
REPLACEINTO `table_name`(`col_name`, ...) VALUES (...);
REPLACEINTO `table_name` (`col_name`, ...) SELECT ...;
REPLACEINTO `table_name` SET `col_name`='value'
示例: REPLACE INTO books SELECT 1 , 'MySQL Manual' FROM books
技巧三:ON DUPLICATE KEY UPDATE
具體語法: INSERT INTO table ( field1 , field2 , fieldn ) SELECT 'field1' , 'field2' , 'fieldn' FROM DUAL WHERE NOT EXISTS ( SELECT field FROM table WHERE field = ? )
其中的 DUAL 是一個臨時表,不需要物理創建。
示例: INSERT INTO books ( name ) VALUES ( 'MySQL Manual' ) ON duplicate KEY UPDATE id = id
技巧四:INSERT INTO IF EXISTS
根據select的條件判斷是否插入,可以不光通過primary 和unique來判斷,也可通過其它條件。
示例: INSERT INTO books ( name ) SELECT 'MySQL Manual' FROM dual WHERE NOT EXISTS ( SELECT id FROM books WHERE id = 1 )