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