具有组装主键的外键约束(关系)

时间:2014-07-25 08:35:56

标签: sql sql-server sql-server-2008

以下示例用于解释我想要实现的目标。考虑一个包含用户的表,另一个包含主题的表。每个用户应该能够对每个主题(一次)进行评级,但不需要对每个主题进行评级。这些是示例的示例表:

CREATE TABLE [Topic](
    [topicID] [int] NOT NULL,
    [topic] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Topic] PRIMARY KEY(topicID))

CREATE TABLE [User](
    [userID] [int] NOT NULL,
    [name] [nvarchar](50) NOT NULL
 CONSTRAINT [PK_User] PRIMARY KEY(userID))

CREATE TABLE [Vote](
    [topicID] [int] NOT NULL,
    [userID] [int] NOT NULL,
    [vote] [int] NOT NULL,
 CONSTRAINT [PK_Vote] PRIMARY KEY 
([topicID],[userID]))

选择主键PK_Vote是为了指定一个约束,每个用户最多只能为每个主题投票一次。 有没有办法使用这个组装的主键指定外键约束(关系)?据我所知,我只能引用一个密钥,所以这是不可能的,因为密钥的每个部分(列)应该与不同表的主键匹配。

我想要这个SQL Server 2008。

1 个答案:

答案 0 :(得分:1)

我建议创建带有标识列的投票表,并添加唯一索引以限制插入重复记录,并为用户和主题表创建外键约束。

CREATE TABLE [Vote](
    VoteId INT NOT NULL IDENTITY(1,1),
    [topicID] [int] NOT NULL,
    [userID] [int] NOT NULL,
    [vote] [int] NOT NULL,
 CONSTRAINT [PK_Vote] PRIMARY KEY ([VoteId]))
 GO

 CREATE UNIQUE NONCLUSTERED INDEX UX_Vote ON dbo.Vote(TopicID, UserID)
 ALTER TABLE [Vote] ADD CONSTRAINT FK_Vote_Topic FOREIGN KEY(TopicID) REFERENCES dbo.Topic(TopicID)
 ALTER TABLE [Vote] ADD CONSTRAINT FK_Vote_User FOREIGN KEY(UserID) REFERENCES dbo.[User](UserID)