INSERT INTO ... SELECT *中的列顺序很重要?

问题描述 投票:1回答:2

假设我在MySQL数据库中有2个表:

表格1

  • ID
  • name
  • 类型

表2

  • ID
  • 类型
  • name

我想使用这种语法从Table1到Table2导入一行,而不是命名所有列:

INSERT INTO Table2 SELECT * FROM Table1 WHERE ID = 101

列的顺序是否相同?或者只要所有列都具有相同的名称,它会起作用吗?

mysql sql
2个回答
7
投票

两个表中的每一个都有一个实际的列顺序,您可以通过检查信息模式表来查看。但是,您不应该依赖于此,因为它可能会在将来某个时候发生变化。

因此,最佳做法是始终指定与INSERT相关的列,包括INSERT INTO ... SELECT

INSERT INTO Table2 (ID, Name, Type)
SELECT ID, Name, Type
FROM Table1
WHERE ID = 101;

无论每个表中的基础列顺序如何,上述查询将始终按预期运行。


4
投票

订单很重要。这些名字无关紧要。

最好按照您想要的顺序明确命名列,而不是使用select *,而不是完全从插入端省略它们。

这意味着任何人都可以完全清楚地看到代码正在做什么,SQL引擎没有错误解释指令的危险,并且对任一表的定义的任何更改(例如添加的字段或更改的顺序)都不会中断查询。

例如(使用名称和订单都不匹配的方案):

INSERT INTO Table2 (field1, field5, field2)
SELECT fieldA, fieldC, fieldX 
FROM Table1 
WHERE ID = 101
© www.soinside.com 2019 - 2024. All rights reserved.