Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 查询优化:在修改一个或几个列后,将表中的几个RAW插入到同一个表中:_Sql Server_Sql Server 2008 - Fatal编程技术网

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

Sql server 查询优化:在修改一个或几个列后,将表中的几个RAW插入到同一个表中:,sql-server,sql-server-2008,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 REA

嗯,我需要在表(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。[订单详细信息]表,我有点懒;)

最后,除了上面的插入脚本,我不需要指定所有列的名称。请注意,在某些情况下,一列可能是标识列


所有的答案和意见将不胜感激

如果OrderID或OrderID和ProductID的组合是PK,则复制PK的插入将失败,并违反PK约束。您正在尝试插入10530,它已经存在

如果OrderID是一个标识自动增量字段,则应执行以下操作,并将创建一个新的OrderID值:

INSERT INTO DBO.ORDERDATA(ProductID,UnitPrice,Quantity,Discount)
SELECT ProductID,UnitPrice*-1,Quantity,Discount FROM DBO.ORDERDATA
WHERE OrderID=10530 
您可能希望避免处理关键约束,但它们实际上告诉您有关此数据的一些重要信息。例如,如果OrderID和ProductID的组合是主键,这意味着该表应该只有一条记录具有该键值组合。您不应该希望以这种方式插入副本

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

同样的情况也适用于在不命名所有字段的情况下插入记录。你可以避免这样做,但你为什么要这样做?字段名对于插入的完整性很重要

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

  • 具有标识属性。将使用下一个增量标识值

  • 有一个默认值。使用列的默认值

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

  • 可为空。使用空值

  • 是一个计算列。使用计算值