2010-07-08 91 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