尝试分别插入两行。我敢打赌至少有一个失败,但不一定两者都失败。失败不是来自仅在插入语句中找到的数据,除非您在各个列上同时具有复合主键/唯一约束和另一个唯一约束。
你也能解释一下你是如何有两个主键一起形成一个复合键的吗?一张表只能有一个主键。您能否编写表定义脚本(在 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)