INSERT INTO ... SELECT,不详细说明所有列

Jon*_*han 21 mysql sql database

如何从插入选定行table_sourcetable_targetMySQL中,其中使用SQL:

  • 两个表都具有相同的模式
  • 除自动增量外,所有列都应传输 id
  • 没有明确写出所有列名,因为这将是乏味的

琐碎INSERT INTO table_target SELECT * FROM table_source无法在主键重复的条目.

Mar*_*c B 22

您可以在插入中列出所需的所有字段...选择,或者在外部使用其他内容为您构建列表.

SQL没有类似的东西SELECT * except somefield FROM,所以你必须咬紧牙关并写出字段名称.

  • 获取csv字段名称的最简单方法:从INFORMATION_SCHEMA.COLUMNS所在的TABLE_SCHEMA ='dbname'和TABLE_NAME ='tablename'GROUP BY TABLE_NAME的`SELECT CONCAT(GROUP_CONCAT(COLUMN_NAME SEPARATOR','),“ \ n”) (3认同)
  • 你是对的,最后我使用了显式语法.为了完整性:使用[`DESCRIBE`](http://dev.mysql.com/doc/refman/5.0/en/describe.html)轻松获取列列表,然后使用语法`INSERT INTO table1(field1,field2) ,field3)SELECT table2.field1,table2.field2,table2.field3 FROM table2;` (2认同)

Dev*_*art 19

必须指定列名称 -

INSERT INTO table_target SELECT NULL, column_name1, column_name2, column_name3, ...
  FROM table_source;
Run Code Online (Sandbox Code Playgroud)

只需将NULL作为自动增量id字段的值传递.


sti*_*vlo 5

当然,主键必须是唯一的。这取决于要实现的目标,但是可以排除具有主键的行。

INSERT INTO table_target SELECT * FROM table_source 
WHERE table_source.id NOT IN (SELECT id FROM table_target)
Run Code Online (Sandbox Code Playgroud)

UPDATE:由于还需要额外的行,因此您应该首先解决冲突,table_source是否具有关系?如果没有,您可以更改这些键:

UPDATE table_source SET id = id + 1000
WHERE id IN (SELECT id FROM table_target)
Run Code Online (Sandbox Code Playgroud)

其中1000是一个常数,足够大,因此它们可以放在表末尾。


Lar*_*tig 5

乏味但安全和正确。

在不提供列列表的情况下编写 INSERT 语句会导致代码难以调试,更重要的是,非常脆弱的代码会在表的定义发生更改时中断。

如果您绝对不能自己写出列名,那么在您的代码中构建一个工具来为您创建逗号分隔的列表相对容易。