主键表的一部分的外键

时间:2012-08-20 04:21:11

标签: sql-server

我有一个包含此表转换客户端的数据库我想在这些表之间建立关系,因此转化中的ID_Send参考客户端中的ID和转化中的ID_Receive 客户端中的ID参考

create table Conversion(ID_Send int ,
                        ID_Receive int ,
                        [Time] datetime,
                        [Message] varchar(2048),
                        primary key(ID_Send,ID_Receive,[Time])
                        )

create table Client (ID int IDENTITY(1,1) primary key,
                    [First name] varchar(500) not null,
                    [Last Name]varchar(500) not null,
                    [Birth day] datetime,
                    Gender bit not null,
                    Country  varchar(200)not null,
                    City varchar(200) ,
                    [Language] varchar(200)not null, 
                    [Chat name] varchar(500)not null ,
                    [Password] varchar (500)not null,
                    --foreign key(ID) REFERENCES Conversion (ID_Send)--there is an error 
                    ) 

2 个答案:

答案 0 :(得分:2)

如果您有复合主键(由多个列组成),所有外键必须使用PK的所有列来引用该表。< / p>

毕竟:你怎么能从子表中向父母做出明确的,确定性的引用呢?只有当您使用唯一标识的列时,父表中的一行才能正常工作。

唯一的解决方法是在父表中的ID_SendID_Receive列上放置一个UNIQUE索引,然后引用该唯一索引。

但问题是:如果这些值是唯一的 - 为什么这些列中没有一个是你的主键?

答案 1 :(得分:2)

Motazz,表中只有一个主键,就像你在Client表中一样。摆脱错误:

首先创建Client表, 第二个用以下代码替换转换代码:

create table Conversion(ID_Send int FOREIGN KEY REFERENCES Client(ID),
                    ID_Receive int FOREIGN KEY REFERENCES Client(ID),
                    [Time] datetime,
                    [Message] varchar(2048),
                    primary key(ID_Send,ID_Receive,[Time])
                    )