我有两个 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
中未使用的唯一主键。所有其他列都将复制。我找不到任何选项来执行此操作。
我确实找到了一个潜在的解决方案。
id
需要是主键列的名称并且类型必须匹配:
ALTER TABLE `pending_table` DROP PRIMARY KEY,
CHANGE `id` `id` int(11)
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 来维护或更新。