-->

如何INSERT INTO ... SELECT与对重复KEY(How to INSERT INTO

2019-10-17 16:20发布

我有相同结构的两个表。 表A中包含了目前所有的广告,表B包含已归档的广告。 柱1(ad_id)是主键,AI,INT。 表引擎是MyISAM的。

我需要复制所有的某一日期,以存档,表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字段具有较低的数字,经常重复的ID表B.因此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。

然后,我尝试了一些使用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是一个静态变量)。

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

Answer 1:

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

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


Answer 2:

you may drop the primary key constraint on your ad_id of your table B using th following command.

ALTER TABLE B DROP PRIMARY KEY

Then try your usual query i.e.

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

UPDATE 1

if you dont want to have multiple ad_id then you may directly try this query

   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);

Here is the SQL Fiddle



文章来源: How to INSERT INTO…SELECT with ON DUPLICATE KEY