违反主键约束的主键约束

时间:2012-04-24 20:45:23

标签: sql-server

INSERT INTO tbl_AllParcel
           ([P_ID],[Sub_ID],[X_COORD],[Y_COORD])

VALUES 
       ('0706' , '002' , '579002' , '1167176'),
       ('0706' , '003' , '579013' , '1167153')

P_ID和Sub_ID是一起形成复合键的主键。我收到以下错误消息,我运行上面的代码。单独的复合键不应该创建唯一值吗?

  

Ms 2627,Level 14,State 1,Line 2   违反PRIMARY KEY约束'PK_tbl_Parcel'。无法在对象'dbo.tbl_AllParcel'中插入重复键。   声明已经终止。

2 个答案:

答案 0 :(得分:2)

尝试分别插入两行。我打赌至少有一个失败,但不一定都是。除非您在单个列上同时具有复合主键/唯一约束和另一个唯一约束,否则故障不会来自仅在insert语句中找到的数据。

您还能解释一下如何将两个主键组合在一起形成复合键吗?一个表只能有一个主键。你可以编写表定义脚本(右键单击SSMS中的对象资源管理器,脚本表格为,创建到,剪贴板),并将其添加到问题中,以便我们就术语达成一致吗?

如果您对P_ID有唯一约束并且对Sub_ID有唯一约束,那么表中只能有每个值中的一个,而不是我想要的(只有组合)必须是独一无二的)。如果您对各列有唯一约束,那么这是无效的,因为它不违反组合约束但它确实违反了第一列的约束:

P_ID Sub_ID
---- ------
0706 002
0706 003

我们可以告诉您如何解决这个问题(并确认没有P_ID ='0706'和Sub_ID ='002'或'003'的行)。当你这么说时会发生什么:

SELECT COUNT(*) FROM dbo.tbl_AllParcel WHERE P_ID = '0706' AND Sub_ID = '002';

?或者更重要的是,我想,取决于您提供的脚本:

SELECT COUNT(*) FROM dbo.tbl_AllParcel WHERE P_ID   = '0706';
SELECT COUNT(*) FROM dbo.tbl_AllParcel WHERE Sub_ID = '002';

要在不向各列添加键的情况下创建组合键,请不要选择单个列。以下是使用CREATE TABLE执行此操作的方法:

CREATE TABLE dbo.tbl_AllParcel2
(
  P_Id   CHAR(4),
  Sub_Id CHAR(3),
  ... other columns,
  CONSTRAINT PK_Parcel PRIMARY KEY(P_Id, Sub_Id)
);

我假设您当前正在使用UI。不要试图在表设计器中这样做 - 这是一大堆垃圾。学习DDL,它会让你更进一步。以下是联机丛书中的CREATE TABLEALTER TABLE主题,其中包含大量用于定义各种约束和其他表属性的示例:

CREATE TABLE (MSDN)
ALTER TABLE (MSDN)

答案 1 :(得分:1)

此错误表示您已经在表中为该复合键获得了这两个中的一个。

'0706' , '002' 
'0706' , '003'