尝试使用 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
我错过了什么?
提前致谢!
答案 0 :(得分:4)
尝试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
答案 1 :(得分:0)
以下是我的想法。
您似乎在AUTO_INCREMENT
字段中插入了ID。我建议让你的item
表分配ID。如果我正确阅读了本手册,使用IGNORE
会将错误静音到警告并让语句继续。执行INSERT
时,这可能会忽略表格上的关键约束。
答案 2 :(得分:0)
正如CREATE TABLE
Syntax所述:
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 | +------+---------+------------+---------------------+---------------------+
但是,这些记录似乎也违反了PRIMARY KEY
上的id
约束(即它们似乎是相同的记录)。您显示的输出不太可能是您定义的item
表的摘录:您几乎肯定会查看其他表或查询的内容。
一种可能的解释是,您已经定义了一个同名的TEMPORARY TABLE
,它隐藏了定义item
约束的基础UNIQUE
表。 SHOW CREATE TABLE item;
应该有助于确认您所指的是您所指的表,并且该表已经为您定义了您期望的约束。
如果您完全确定该表确实包含UNIQUE
个约束的重复条目(如果TRUE
列中有重复项,则以下语句将返回id
)可能会尝试使用myisamchk
执行一些表维护。
SELECT EXISTS (SELECT * FROM item GROUP BY id HAVING COUNT(*) > 1);