簡體   English   中英

使用UNIQUE KEY的mySQL INSERT IGNORE SELECT不起作用

[英]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時,這可能會忽略對表的關鍵約束。

CREATE TABLE語法中所述

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 |
+------+---------+------------+---------------------+---------------------+

但是,這些記錄似乎也違反了對idPRIMARY 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM