好吧,我需要在表(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列。
所有答案和评论将不胜感激。
答案 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中,则数据库引擎必须能够 根据列的定义提供值;否则, 行无法加载。数据库引擎自动提供 如果列:
,则列的值
具有IDENTITY属性。使用下一个增量标识值。
有默认值。使用该列的默认值。
具有时间戳数据类型。使用当前时间戳值。
可以为空。使用空值。
- 醇>
是计算列。使用计算值。