说我在MySQL数据库中有2个表:
表1
表2
我想使用此语法而不是命名所有列将表1中的行导入表2:
INSERT INTO Table2 SELECT * FROM Table1 WHERE ID = 101
这些列的顺序不同是否重要?还是只要所有列都具有相同的名称,它将起作用吗?
答案 0 :(得分:7)
两个表中的每一个都有实际的列顺序,您可以通过检查信息模式表来看到。 但是,您不应该依赖它,因为它将来可能会改变。
因此,最佳实践是始终指定INSERT
所涉及的列,包括INSERT INTO ... SELECT
的情况:
INSERT INTO Table2 (ID, Name, Type)
SELECT ID, Name, Type
FROM Table1
WHERE ID = 101;
无论每个表中的基础列顺序如何,上述查询都将始终如您所愿。
答案 1 :(得分:4)
顺序很重要。名称无关紧要。
最好以所需的顺序显式命名列,而不要使用select *,而不要从插入端完全省略它们。
这意味着任何人都可以很清楚地看到它在做什么,SQL引擎不会误解该指令,也不会对任何表的定义进行任何更改(例如,添加字段或更改顺序)的危险。不会中断查询。
例如(使用名称和顺序都不匹配的方案):
INSERT INTO Table2 (field1, field5, field2)
SELECT fieldA, fieldC, fieldX
FROM Table1
WHERE ID = 101