查询优化:修改一列或几列后,将表中的几行插入到同一个表中:

时间:2013-05-08 17:35:22

标签: sql-server sql-server-2008

好吧,我需要在表(DBO.ORDERDATA)中插入一些行,并进行一些数学修改(这里乘以-1)到一列(单价),保持其他列的值不变。

以下是代码:考虑Northwind DB:

CREATE TABLE DBO.ORDERDATA
(
    OrderID INT NOT NULL,
    ProductID INT NOT NULL,
    UnitPrice MONEY NOT NULL,
    Quantity SMALLINT NOT NULL,
    Discount REAL NOT NULL
)

INSERT INTO DBO.ORDERDATA
SELECT * FROM DBO.[Order Details]

插入代码如下:

INSERT INTO DBO.ORDERDATA (OrderID, ProductID, UnitPrice, Quantity, Discount)
    SELECT 
        OrderID, ProductID, UnitPrice * -1, Quantity, Discount 
    FROM 
        DBO.ORDERDATA
    WHERE 
        OrderID = 10530 

我逃脱了内置的DBO。[Order Details]表由于许多键约束,我有点懒;)

最后是上面插入脚本的替代方法,我不需要指定所有列名。请注意,在某些情况下,一列可能是Identity列。

所有答案和评论将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果OrderID或OrderID和ProductID的组合是PK,那么复制PK的插入将因PK约束违规而失败。您正在尝试插入已经存在的10530。

如果OrderID是IDENTITY自动增量字段,则以下内容应该有效,并且将创建一个新的OrderID值:

INSERT INTO DBO.ORDERDATA(ProductID,UnitPrice,Quantity,Discount)
SELECT ProductID,UnitPrice*-1,Quantity,Discount FROM DBO.ORDERDATA
WHERE OrderID=10530 

您可能希望避免处理关键约束,但实际上它们会告诉您有关此数据的重要信息。例如,如果OrderID和ProductID的组合是PK,则表示该表应该只有一个具有该键组合值的记录。您不应该以这种方式插入副本。

您尝试插入副本的原因是什么?如果您尝试在此订单上实施“信用”,那么您可能需要考虑实现此方法的一些方法,这不会破坏数据完整性。钥匙是有充分理由的。例如,您可以在复合键中添加“transactiontype”字段,如果这是对此数据含义的最佳描述。

尝试在不命名所有字段的情况下插入记录也是如此。您可以避免这样做in the following cases,但为什么要这样做?字段名对插入的完整性很重要。

  

如果列不在column_list中,则数据库引擎必须能够   根据列的定义提供值;否则,   行无法加载。数据库引擎自动提供   如果列:

,则列的值      
      
  1. 具有IDENTITY属性。使用下一个增量标识值。

  2.   
  3. 有默认值。使用该列的默认值。

  4.   
  5. 具有时间戳数据类型。使用当前时间戳值。

  6.   
  7. 可以为空。使用空值。

  8.   
  9. 是计算列。使用计算值。

  10.