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'中插入重复键。 声明已经终止。
答案 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 TABLE
和ALTER TABLE
主题,其中包含大量用于定义各种约束和其他表属性的示例:
答案 1 :(得分:1)
此错误表示您已经在表中为该复合键获得了这两个中的一个。
'0706' , '002'
'0706' , '003'