P粉3389695672023-08-30 10:05:32
解決方案:
#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
代表要插入的值。 DUAL
是指所有 Oracle 資料庫中預設存在的一種特殊的單行單清單(請參閱 https://en.wikipedia.org/wiki/DUAL_table#)。在 MySQL-Server 版本 5.7.26 上,當省略 FROM DUAL
時,我得到了有效的查詢,但舊版本(如 5.5.60)似乎需要 FROM
資訊。透過使用 WHERE NOT EXISTS
,如果最裡面的查詢找到匹配的數據,中間查詢將傳回一個空結果集。
外部查詢
INSERT INTO `table` (`value1`, `value2`)
插入資料(如果中間查詢傳回任何資料)。
P粉5210131232023-08-30 00:40:11
使用INSERT IGNORE INTO table
。
還有 INSERT … ON DUPLICATE KEY UPDATE
語法,您可以在 13.2.6.2 INSERT ... ON DUPLICATE KEY UPDATE 語句。
來自 bogdan 的貼文.org.ua 根據Google 的網路快取:
#