0

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

这是代码:考虑罗斯文数据库:

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] 表,我有点懒;)

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

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

4

1 回答 1

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,这意味着表应该只有一个具有该键值组合的记录。您不应该以这种方式插入重复项。

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

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

如果列不在 column_list 中,则数据库引擎必须能够根据列的定义提供值;否则,无法加载该行。如果列出现以下情况,数据库引擎会自动为该列提供一个值:

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

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

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

  4. 可以为空。使用空值。

  5. 是一个计算列。使用计算值。

于 2013-05-08T18:19:25.727 回答