首页 > 解决方案 > 如何将临时表中的所有列插入主表而不重复列?

问题描述

CREATE TABLE persons_temp LIKE persons;
LOAD DATA LOCAL INFILE INTO TABLE persons_temp ...
INSERT INTO persons SELECT * FROM persons_temp;

问题:如果我的主persons表有一个id自动增量列作为主键,那么在插入过程中,java.sql.SQLException: Duplicate entry '1' for key 'PRIMARY'如果我的主表和临时表的索引不同步,我会得到错误。

问题:是否可以将临时表复制插入到主表中,而不必显式定义每一列?

我想id从临时表中删除该列,但是在复制插入时我会收到一个错误,因为 id 会丢失。

标签: mysqlsql

解决方案


在这样的查询中:

INSERT INTO persons SELECT * FROM persons_temp;

没有列列表的 INSERT 的简写是插入到所有列中。

的简写SELECT *是它选择所有列。

SQL 没有“all-columns-but-one”的简写。如果您不想要所有列,则可以命名列。

您可以依赖 INSERT 的隐式列列表,然后使用 NULL 代替 SELECT 中的主键。NULL 将激活自动增量行为。

INSERT INTO persons SELECT NULL, col2, col3, col4... FROM persons_temp;

但我建议您根本不要依赖隐式列列表。在你的代码中明确。如果有人更改persons表、添加或删除列或更改列的顺序怎么办?然后您的查询将返回一个奇怪的错误,或者更糟的是,将临时表中的值放入错误的persons.


根据上面 Paul Spiegel 的评论,我认为可以在创建临时表后执行此操作:

UPDATE persons_temp SET id = NULL;

然后进行INSERT... SELECT *查询,它将使用隐式列,但 NULL 将在persons插入时激活自动增量。


推荐阅读