1

INSERT INTO SELECTを使用し、2 つのソース テーブルを結合して、空の MySQL テーブルにデータを入力しようとしています。UNIQUE KEYとして定義された 2 つの宛先テーブル列に基づく重複行の挿入をIGNOREしたいのですが、何らかの理由で、これら 2 つの列に基づく重複行がまだ挿入されています。

宛先表の定義:

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

私は何が欠けていますか?

前もって感謝します!

4

2 に答える 2

7

句でDISTINCTキーワードを試してください。SELECT

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
于 2012-08-31T00:03:27.527 に答える
0

CREATE TABLESyntaxの下に記載されているように:

UNIQUEインデックスは、インデックス内のすべての値が個別でなければならないという制約を作成します。

列に対して定義された複合インデックスがある(item_id,account_id)ため、制約はすべてのレコードがこれら 2 つの列の異なる組み合わせを持つことのみを必要とします。

上記の例では、この制約に違反しているように見える唯一のレコードは次のとおりです。

+--------+---------------------+------------+------------------- --+---------------------+
| | ID | item_id | アカウント ID | 作成日 | 修正日 |
+--------+---------------------+------------+------------------- --+---------------------+
| | 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 |
+--------+---------------------+------------+------------------- --+---------------------+

ただし、これらのレコードもPRIMARY KEY制約に違反してidいるように見えます (つまり、同じレコードに見えます)。表示された出力が実際にitem定義したテーブルから抽出されたものである可能性はほとんどありません。ほぼ確実に、他のテーブルまたはクエリの内容を見ています。

考えられる説明の 1 つは、制約が定義され ている基になるテーブルTEMPORARY TABLEを隠している同じ名前の を定義したことです。考えているテーブルを参照していることと、そのテーブルが期待する制約を定義していることの両方を確認するのに役立ちます。itemUNIQUESHOW CREATE TABLE item;

テーブルに制約の重複エントリが実際に含まれていることが確実な場合(列に重複がある場合UNIQUE、次のステートメントが返されます)、 を使用してテーブルのメンテナンスを実行してみてください。TRUEidmyisamchk

SELECT EXISTS (SELECT * FROM item GROUP BY id HAVING COUNT(*) > 1);
于 2012-08-31T03:18:01.367 に答える