INSERT INTO `table` (`value1`, `value2`) SELECT 'stuff for value1', 'stuff for value2' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `table` WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1)
說明:
最裡面的查詢
SELECT * FROM `table` WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1
用作WHERE NOT EXISTS條件,偵測是否已存在包含要插入資料的行。找到此類別的一行後,查詢可能會停止,因此LIMIT 1(微優化,可以省略)。
中間查詢
SELECT 'stuff for value1', 'stuff for value2' FROM DUAL
解決方案:
#說明:
最裡面的查詢
用作
WHERE NOT EXISTS
條件,偵測是否已存在包含要插入資料的行。找到此類別的一行後,查詢可能會停止,因此LIMIT 1
(微優化,可以省略)。中間查詢
代表要插入的值。
DUAL
是指所有 Oracle 資料庫中預設存在的一種特殊的單行單清單(請參閱https://en.wikipedia.org/wiki/DUAL_table#)。在 MySQL-Server 版本 5.7.26 上,當省略FROM DUAL
時,我得到了有效的查詢,但舊版本(如 5.5.60)似乎需要FROM
資訊。透過使用WHERE NOT EXISTS
,如果最裡面的查詢找到匹配的數據,中間查詢將傳回一個空結果集。外部查詢
插入資料(如果中間查詢傳回任何資料)。
使用
INSERT IGNORE INTO table
。還有
INSERT … ON DUPLICATE KEY UPDATE
語法,您可以在13.2.6.2 INSERT ... ON DUPLICATE KEY UPDATE 語句。來自bogdan 的貼文.org.ua根據Google 的網路快取:
#