1
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 都是主键,它们共同构成一个复合键。我收到以下错误消息,我运行上面的代码。唯一值不应该由复合键单独创建吗?

消息 2627,级别 14,状态 1,第 2 行违反主键约束“PK_tbl_Parcel”。无法在对象“dbo.tbl_AllParcel”中插入重复键。该语句已终止。

4

2 回答 2

2

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

你也能解释一下你是如何有两个主键一起形成一个复合键的吗?一张表只能有一个主键。您能否编写表定义脚本(在 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

创建表 (MSDN)
更改表 (MSDN)

于 2012-04-24T21:30:39.000 回答
1

此错误意味着您已经在该复合键的表中获得了这两个之一。

'0706' , '002' 
'0706' , '003' 
于 2012-04-24T20:48:15.027 回答