假设我在MySQL数据库中有2个表:
表格1
表2
我想使用这种语法从Table1到Table2导入一行,而不是命名所有列:
INSERT INTO Table2 SELECT * FROM Table1 WHERE ID = 101
列的顺序是否相同?或者只要所有列都具有相同的名称,它会起作用吗?
两个表中的每一个都有一个实际的列顺序,您可以通过检查信息模式表来查看。但是,您不应该依赖于此,因为它可能会在将来某个时候发生变化。
因此,最佳做法是始终指定与INSERT
相关的列,包括INSERT INTO ... SELECT
:
INSERT INTO Table2 (ID, Name, Type)
SELECT ID, Name, Type
FROM Table1
WHERE ID = 101;
无论每个表中的基础列顺序如何,上述查询将始终按预期运行。
订单很重要。这些名字无关紧要。
最好按照您想要的顺序明确命名列,而不是使用select *,而不是完全从插入端省略它们。
这意味着任何人都可以完全清楚地看到代码正在做什么,SQL引擎没有错误解释指令的危险,并且对任一表的定义的任何更改(例如添加的字段或更改的顺序)都不会中断查询。
例如(使用名称和订单都不匹配的方案):
INSERT INTO Table2 (field1, field5, field2)
SELECT fieldA, fieldC, fieldX
FROM Table1
WHERE ID = 101