mysql - 如何将临时表中的所有列插入主表而不重复列?
问题描述
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 会丢失。
解决方案
在这样的查询中:
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
插入时激活自动增量。
推荐阅读
- node.js - 如何将请求 https 发送到 http?
- angularjs - angularjs中内置指令的隔离范围
- mysql - Server-Syncing DB App,关于主键,多表,节省存储空间的问题
- python - 使用树莓派 GPIO 的 Python 视频显示
- date - MS Access-如何检查字段值是否等于先前的记录?
- c - 函数总是返回指向空的指针
- arduino - 通过 arduino 上的串行发送的数据有时会发生字节移位
- javascript - D3 v5 Post 使用 fetch 返回未处理的承诺拒绝 405
- unreal-engine4 - 什么是播放器控制器和自动属性?
- java - 如何复制到剪贴板(从 ViewHolder)?