gpt4 book ai didi

mysql - 如何使用 ON DUPLICATE KEY INSERT INTO...SELECT

转载 作者:行者123 更新时间:2023-11-29 00:35:07 26 4
gpt4 key购买 nike

我有两个结构相同的表。表 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 摇摇晃晃地告诉我我有一个 重复条目'8577' 键 '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 是静态变量)。

我在这里做错了什么?我是不是让这种方式太难了?

最佳答案

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

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

关于mysql - 如何使用 ON DUPLICATE KEY INSERT INTO...SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14700664/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com