1

我有两个结构相同的表。表 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 是静态变量)。

我在这里做错了什么?我这样做是不是太难了?

4

2 回答 2

1

在你的情况下为什么不使用?

INSERT INTO B(`ad_advertiser`, `ad_ln`, `ad_expire`) 
    SELECT (`ad_advertiser`, `ad_ln`, `ad_expire`)
    FROM A
    WHERE YEAR( ad_expire ) <= 2012 
于 2013-02-05T05:31:02.303 回答
0

您可以 使用以下命令删除您ad_id的主键约束。table B

ALTER TABLE B DROP PRIMARY KEY

然后尝试您通常的查询,即

INSERT INTO B`(`ad_id`, `ad_advertiser`, `ad_ln`, `ad_expire`) 
    SELECT *
    FROM A
    WHERE YEAR( ad_expire ) <= 2012

更新 1

如果您不想拥有多个ad_id,则可以直接尝试此查询

   INSERT INTO `B`(`ad_id`, `ad_advertiser`, `ad_ln`, `ad_expire`) 
    SELECT *
    FROM A
    WHERE YEAR( ad_expire ) <= 2012
   ON DUPLICATE KEY UPDATE
    ad_advertiser = VALUES(ad_advertiser), 
    ad_ln = VALUES(ad_ln), 
    ad_expire = VALUES(ad_expire);

这是SQL 小提琴

于 2013-02-05T06:11:41.663 回答