INSERT INTO使用有哪些最佳实践?插入数据是否需显式指定所有列名?
问题答复
在INSERT语句中显式声明所有目标列名属于工业界公认的SQL开发最佳实践,强烈建议你补充这部分写法,核心原因有三点:
- 避免列顺序匹配错误:如果后续
[Purchasing].[PurchaseOrderDetail_2]的表结构发生调整(比如新增列、调整列顺序),你当前省略列名的写法完全依赖SELECT返回的列顺序和表结构的列顺序严格一致,一旦顺序不匹配轻则插入报错,重则出现数据错列写入的隐性故障,排查成本极高。 - 提升代码可维护性:显式写清列名后,任何维护人员不需要额外查表结构,就能直接对应SELECT返回的每个字段的写入目标,代码可读性大幅提升。
- 兼容表结构变更:如果后续你给目标表新增了带默认值的非必填字段,显式写列名的INSERT语句可以正常运行无需修改;而省略列名的写法会因为SELECT返回的列数和表的总列数不一致直接报错。
你可以将原SQL修改为如下写法(请根据你实际的[Purchasing].[PurchaseOrderDetail_2]的列名调整以下INSERT后的列名列表,确保和SELECT返回的字段顺序一一对应即可):
TRUNCATE TABLE [Purchasing].[PurchaseOrderDetail_2] INSERT INTO [Purchasing].[PurchaseOrderDetail_2] ( Name, ProductNumber, DueDate, OrderQty, ProductID, UnitPrice, LineTotal, ReceivedQty, RejectedQty, StockedQty, ModifiedDate ) SELECT b.Name, b.ProductNumber, a.[DueDate], a.[OrderQty], a.[ProductID], a.[UnitPrice], a.[LineTotal], a.[ReceivedQty], a.[RejectedQty], a.[StockedQty], a.[ModifiedDate] FROM [AdventureWorks2019].[Purchasing].[PurchaseOrderDetail] AS a INNER JOIN Production.Product AS b ON a.ProductID = b.ProductID SELECT * FROM [Purchasing].[PurchaseOrderDetail_2]
内容的提问来源于stack exchange,提问作者lottikkk
相关产品推荐
相关产品推荐

