如何将临时表中的所有列插入主表中而不重复列?

问题描述 投票:0回答:2
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'错误。

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

[我曾考虑从临时表中删除id列,但随后在复制插入时会收到错误消息,因为ID将丢失。

mysql sql
2个回答
1
投票

更改加载前的自动增量值:

SET @maxvalue = SELECT MAX(id) for persons

ALTER TABLE persons_temp AUTO_INCREMENT = @maxvalue + 1;

0
投票

在这样的查询中:

INSERT INTO persons SELECT * FROM persons_temp;

没有列的INSERT的简写是插入到[[all列中。

SELECT *的缩写是它选择

all

列。SQL没有“ all-columns-one-”的简写形式。如果您不希望所有列,都可以为列命名。

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

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

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

0
投票
您可以这样做:

INSERT INTO persons (MAYBY_ID, COL1, COL2, ...) INSERT * FROM persons_temp;

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