【发布时间】:2021-04-05 10:20:38
【问题描述】:
这里是初学者。我正在尝试在 SSMS 上创建这个简单的联合表,但我收到了关于主键的重复错误:
消息 2627,第 14 级,状态 1,第 23 行
违反主键约束“PK__FactOffl__B14003C24ECE0589”。无法在对象“dbo.FactOfflineSales”中插入重复键。重复键值为 (43659)。
我做错了什么?
CREATE TABLE FactOfflineSales
(
SalesOrderID int NOT NULL PRIMARY KEY,
SalesOrderNumber nvarchar(20) NOT NULL,
SalesPersonID int NULL,
CustomerID int NULL,
SpecialOfferID int NOT NULL,
TerritoryID int NOT NULL,
ProductID int NOT NULL,
CurrencyRateID int NULL,
OrderQuantity smallint NULL,
UnitPrice money NULL,
SubTotal money NULL,
TaxAmount money NULL,
Freight money NULL,
LineTotal money NULL,
UnitPriceDiscount float NULL,
OrderDate datetime NULL,
ShipDate datetime NULL,
DueDate datetime NULL,
OnlineOrderFlag int NULL
);
INSERT INTO FactOfflineSales (
SalesOrderID
,SalesOrderNumber
,SalesPersonID
,CustomerID
,SpecialOfferID
,TerritoryID
,ProductID
,CurrencyRateID
,OrderQuantity
,UnitPrice
,SubTotal
,TaxAmount
,Freight
,LineTotal
,UnitPriceDiscount
,OrderDate
,ShipDate
,DueDate
,OnlineOrderFlag
)
SELECT
SalesOrderHeader.SalesOrderID
,SalesOrderHeader.SalesOrderNumber
,SalesOrderHeader.SalesPersonID
,SalesOrderHeader.CustomerID
,SalesOrderDetail.SpecialOfferID
,SalesOrderHeader.TerritoryID
,SalesOrderDetail.ProductID
,SalesOrderHeader.CurrencyRateID
,SalesOrderDetail.OrderQty
,SalesOrderDetail.UnitPrice
,SalesOrderHeader.SubTotal
,SalesOrderHeader.TaxAmt
,SalesOrderHeader.Freight
,SalesOrderDetail.LineTotal
,SalesOrderDetail.UnitPriceDiscount
,SalesOrderHeader.OrderDate
,SalesOrderHeader.ShipDate
,SalesOrderHeader.DueDate
,SalesOrderHeader.OnlineOrderFlag
FROM
AdventureWorks2019.Sales.SalesOrderHeader SalesOrderHeader
LEFT JOIN
AdventureWorks2019.Sales.SalesOrderDetail SalesOrderDetail ON SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID;
【问题讨论】:
-
MSSQL 告诉您您将记录加倍,或者您尝试使用
SalesOrderId=43659添加记录。此类记录已经存在并且您需要对其进行过滤,或者使用 SalesOrderDetail LEFT JOIN 在 SalesOrderId 上生成重复项。 -
我假设您必须首先注意您对 SalesOrderHeader 和 SalesOrderDetail 进行的查询的结果。不应有重复的 SalesOrderID 值。
-
您的连接应该确定数据库上下文 - 不要在没有充分理由的情况下使用 3 个部分名称。接下来,给您的表提供简短(但不神秘)的别名。保存你的手指 - 你会打字很长时间。
-
您的查询和新表在逻辑上根本不匹配。是时候备份并考虑(解释)你想要完成的事情了。在不知道这一点的情况下,你可能会得到这个“工作”,只是为了沿着一条最终到达你选择的位置的路径向下移动。如前所述,标题和详细信息之间存在 1:m 关系,因此您尝试使用标题行的 PK 作为表的主键根本行不通。
标签: sql-server duplicates primary-key