如何在MySQL中實現「如果不存在則插入」的操作?
P粉005105443
P粉005105443 2023-08-29 10:59:40
0
2
517
<p>我首先透過Google搜尋找到了這篇文章<em>如何在標準 SQL 中編寫 INSERT if NOT EXISTS 查詢</em>,其中討論了互斥表。 </p> <p>我有一個包含約 1400 萬筆記錄的表。如果我想以相同的格式添加更多數據,有沒有一種方法可以確保我想要插入的記錄不存在,而不使用一對查詢(即,一個要檢查的查詢和一個要插入的查詢,結果集是空)? </p> <p>字段上的 <code>unique</code> 約束是否保證 <code>insert</code> 如果已經存在就會失敗? </p> <p>看起來<em>只是</em>一個約束,當我透過 PHP 發出插入時,腳本會發出嘎嘎聲。 </p>
P粉005105443
P粉005105443

全部回覆(2)
P粉338969567

解決方案:

#
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粉521013123

使用INSERT IGNORE INTO table

還有 INSERT … ON DUPLICATE KEY UPDATE 語法,您可以在 13.2.6.2 INSERT ... ON DUPLICATE KEY UPDATE 語句


來自 bogdan 的貼文.org.ua 根據Google 的網路快取

#
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!