从一个表插入到另一个表,但分配新的主键

问题描述 投票:0回答:1

我有两个 MySQL 表。

一个是一个大的条目列表,基本上是主表。第二个是待处理条目表,如果获得批准,最终将被添加到大型条目列表中(如果没有获得批准,则直接被丢弃,而不对主表进行任何更改)。

两个表都有一个自动增量主键,并且所有其他列的结构完全相同。

我使用待处理条目表上的主键来编辑待处理条目,但一旦获得批准,就不再重要了。

我想做一个类似这样的插入:

INSERT INTO `main_table` SELECT * FROM `pending_table`

超级简单又容易!然而,当然有一个错误:

错误!密钥“PRIMARY”重复输入“1”

目前,我正在使用以下查询:

INSERT INTO `main_table` (`col1`, `col2`, ..., `coln`)
SELECT `col1`, `col2`, ..., `coln` FROM `pending_table`

col1
col2
、...、
coln
代表除了主键列之外的所有列,我得一一列出来

当然,如果表中的任何列发生更改,该查询会立即中断,并且我将来很有可能想要添加新列。将同一列添加到两个表中非常容易。我想避免的是必须进入 PHP 文件并在每个使用它的地方手动添加列。

我想要的是设置,以便

pending_table
上的主键将被丢弃并替换为
main_table
中未使用的唯一主键。所有其他列都将复制。我找不到任何选项来执行此操作。

  • “REPLACE”命令没有帮助,因为这将覆盖所有已存在的条目。我在 INSERT 的 DUPLICATE KEY UPDATE 选项上也找不到任何内容。 我发现
  • 这里有一个问题可能会问类似的问题
  • 但我无法理解所提出的解决方案,我希望得到一些简单的解决方案。这只是“可能只是对该问题的一般性解释”。 这看起来完全不同 就像这个一样这家伙刚刚犯了一个错误,他已经在上面做我的“解决方案”了。我找不到任何其他似乎相关的问题。 我可以编写代码来检查表结构并生成动态列列表。然而,这看起来像是一个大杂烩,我希望找到一个更简单、更优雅的解决方案,而无需添加/维护/运行大量额外的 PHP 代码。 我还想过从挂起的表中删除主键列,然后重建整个表,但这也感觉有点混乱。我也不确定它是否有效,因为列数会不同。
  • 同样,通过提前读取主表来手动更新主键列是可行的,但也感觉非常笨拙。如果在分配这些键时其他进程向主表添加一行,则可能会遇到问题(竞争条件)。
  • 有没有更简单的解决方案,或者我已经在做最简单的解决方案了?
  • 感谢您的任何帮助/想法。

我确实找到了一个潜在的解决方案。

mysql insert structure primary-key bulkinsert
1个回答
0
投票
id

需要是主键列的名称并且类型必须匹配:

ALTER TABLE `pending_table` DROP PRIMARY KEY, CHANGE `id` `id` int(11)

从这里开始,需要将主键字段设置为 NULL 才能进行插入。

UPDATE `pending_table` SET `id` = NULL

现在,插入将正常工作,不会因重复主键而出现任何错误。

INSERT INTO `main_table` SELECT * FROM `pending_table`

然后,我们只需使用以下查询恢复挂起表中的主键即可:

ALTER TABLE `pending_table` ADD PRIMARY KEY (`id`),
CHANGE `id` `id` int(11) AUTO_INCREMENT

这不是世界上最简单或最优雅的解决方案,但它都是 SQL,无论列结构如何都可以工作,并且不需要任何额外的 PHP 来维护或更新。

© www.soinside.com 2019 - 2024. All rights reserved.