2010-07-08 90 views
2

我有2个表:SQL服务器的复合键问题

create table numbers2 
(
id1 int IDENTITY(1,1) not null, 
id2 int not null, 
primary key(id1, id2) 
) 

和表2

create table ttt 
(
id int identity(1,1) not null, 
first_name varchar(50) null, 
last_name varchar(50) null, 
sex varchar(1) check (sex in ('m', 'f')) null, 
number_id int not null, 
id_id1 int not null, 
id_id2 int not null, 
primary key(id), 
constraint fk_numbers_id1 foreign key (id_id1) references numbers2(id1) 
on update no action 
on delete no action 
) 

的问题是如何添加约束“fk_numbers_id1”,所以它只会引用复合物的一个组成部分从表number2键。有没有可能或有其他解决方案?

+0

表1你有一个独特的PK(在IDENTITY 1,1),是否有什么理由需要在其中包含id2? – 2010-07-08 15:35:42

+0

这是一个简化的例子,我真正的应用程序包含更复杂的表格,我实际上是将一些代码从mysql移植到mssql,但是在mssql中有些语句停止工作 – Blablablaster 2010-07-08 15:49:21

+0

感谢您的帮助,唯一的约束就是我正在寻找的东西! – Blablablaster 2010-07-08 15:50:43

回答

4

numbers2.id1创建一个唯一约束:

create table numbers2 
(
id1 int IDENTITY(1,1) not null, 
id2 int not null, 
primary key(id1, id2), 
unique(id1) 
) 

我想知道你为什么选择了两列,其中第一列已经是唯一通过自己创建的主键。我敢肯定这违反了某种正常形式的规则,但我不记得哪一个。

如果以覆盖两列数据做了,那么没有必要那样做,只是这样做,而不是(假设在id1的数据是真正唯一的):

create table numbers2 
(
id1 int IDENTITY(1,1) not null, 
id2 int not null, 
primary key(id1), 
) 
create index cover_id2 on numbers2(id2) -- no need to include clustered index columns in a covering index 
+0

+1,正好是我刚才输入的内容... – 2010-07-08 15:36:00

+0

+1,附加说明id1必须是唯一的。作为一个人所期望的身份是独一无二的,但不能保证。 – 2010-07-08 15:43:22

+0

您可以关闭身份并插入任何链接,因此唯一索引是必需的。 – 2010-07-08 15:57:50