我有两个结构相同的表。表 A 包含所有当前广告,表 B 包含存档广告。第 1 列 (ad_id) 是主键、AI、INT。表引擎是 MyISAM。
我需要将某个日期之前的所有表 A 广告复制到存档表 B。我的目标是除了 ad_id 之外的所有字段都是重复的,ad_id 应该自动递增。这是我尝试过的:
INSERT INTO B`(`ad_id`, `ad_advertiser`, `ad_ln`, `ad_expire`)
SELECT *
FROM A
WHERE YEAR( ad_expire ) <= 2012
表 B 有数千个广告,表 A 经常被刷新,以至于唯一 id 字段的数字很少,经常与表 B 中的 id 重复。所以 MySQL 摇摇晃晃地告诉我我有一个Duplicate entry '8577' for key 'PRIMARY'
.
所以我做了几次尝试来克服这个问题:
首先,我尝试选择要插入的各个列,设置ad_id
为 NULL:
INSERT INTO B(`ad_id`, `ad_advertiser`, `ad_ln`, `ad_expire`)
SELECT (NULL, `ad_advertiser`, `ad_ln`, `ad_expire`)
FROM A
WHERE YEAR( ad_expire ) <= 2012
这会导致错误#1241 - Operand should contain 1 column(s)
,如果我使用通配符 * 选择器,该错误就会消失,但随后会出现重复错误。
接下来我尝试SELECT LAST_INSERT_ID()
了,它总是返回 0。
然后我尝试了一些 using ON DUPLICATE KEY UPDATE
,但我似乎无法让它工作。
我什至试图通过以下方式获取最高 id:
SELECT @max := max(ad_id) FROM B;
INSERT INTO B`(`ad_id`, `ad_advertiser`, `ad_ln`, `ad_expire`)
SELECT *
FROM A
WHERE YEAR( ad_expire ) <= 2012
ON DUPLICATE KEY UPDATE ad_id = @max + 1
这仅适用于一行,然后再次导致重复条目(因为 @max 是静态变量)。
我在这里做错了什么?我这样做是不是太难了?