[英]mySQL INSERT IGNORE SELECT with UNIQUE KEY not working
嘗試使用INSERT INTO SELECT填充空MySQL表並連接兩個源表。 希望IGNORE基於定義為UNIQUE KEY的兩個目標表列插入重復行,但由於某種原因,仍然會插入基於這兩列的重復行。
目的地表定義:
CREATE TABLE `item` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`item_id` int(10) unsigned NOT NULL,
`account_id` int(10) unsigned NOT NULL,
`creation_date` datetime NOT NULL,
`modification_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_item` (`item_id`,`account_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
插入查詢:
INSERT IGNORE INTO item
(id,
item_id,
account_id,
creation_date,
modification_date)
SELECT tblItem.ID,
tblItem.itemID,
tblOrder.accID,
tblItem.itemTime,
'0000-00-00 00:00:00'
FROM tblItem
INNER JOIN tblOrder
ON tblItem.orderID = tblOrder.ID
正在將重復的行插入到項目中,類似於以下內容:
id item_id account_id creation_date modification_date
2587 0 2 11/19/11 2:43 0000-00-00 00:00:00
2575 0 1120 11/17/11 19:32 0000-00-00 00:00:00
2575 0 1120 11/17/11 19:32 0000-00-00 00:00:00
382 60 193 0000-00-00 00:00:00 0000-00-00 00:00:00
941 95 916 10/28/11 15:52 0000-00-00 00:00:00
369 108 1 0000-00-00 00:00:00 0000-00-00 00:00:00
373 108 2 0000-00-00 00:00:00 0000-00-00 00:00:00
378 109 2 0000-00-00 00:00:00 0000-00-00 00:00:00
378 109 2 0000-00-00 00:00:00 0000-00-00 00:00:00
我錯過了什么?
提前致謝!
在SELECT
子句中嘗試DISTINCT
關鍵字:
INSERT IGNORE INTO item
(id,
item_id,
account_id,
creation_date,
modification_date)
SELECT DISTINCT tblItem.ID,
tblItem.itemID,
tblOrder.accID,
tblItem.itemTime,
'0000-00-00 00:00:00'
FROM tblItem
INNER JOIN tblOrder
ON tblItem.orderID = tblOrder.ID
這是我的想法。
您好像在將一個ID插入到AUTO_INCREMENT
字段中。 我建議讓你的item
表分配ID。 如果我正確閱讀了本手冊,使用IGNORE
會將錯誤靜音到警告並讓聲明繼續進行。 執行INSERT
時,這可能會忽略對表的關鍵約束。
UNIQUE
索引創建一個約束,使索引中的所有值必須是不同的。
您在列(item_id,account_id)
定義了復合索引,因此約束僅要求每個記錄都具有這兩列的不同組合。
在上面的示例中,似乎違反此約束的唯一記錄是:
+------+---------+------------+---------------------+---------------------+ | id | item_id | account_id | creation_date | modification_date | +------+---------+------------+---------------------+---------------------+ | 2575 | 0 | 1120 | 2011-11-17 19:32:00 | 0000-00-00 00:00:00 | | 2575 | 0 | 1120 | 2011-11-17 19:32:00 | 0000-00-00 00:00:00 | | 378 | 109 | 2 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | | 378 | 109 | 2 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | +------+---------+------------+---------------------+---------------------+
但是,這些記錄似乎也違反了對id
的PRIMARY KEY
約束(即它們看起來是相同的記錄 )。 您顯示的輸出不太可能是您已定義的item
表的摘錄:您幾乎肯定會查看其他表或查詢的內容。
一種可能的解釋是您已經定義了一個同名的TEMPORARY TABLE
,它隱藏了定義UNIQUE
約束的基礎item
表。 SHOW CREATE TABLE item;
應該有助於確認您所指的是您所指的表以及該表已在其上定義了您期望的約束。
如果您完全確定該表確實包含UNIQUE
約束的重復條目(如果id
列中存在重復項,則以下語句將返回TRUE
),您可以嘗試使用myisamchk
執行某些表維護。
SELECT EXISTS (SELECT * FROM item GROUP BY id HAVING COUNT(*) > 1);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.