【问题标题】:Foreign Key Constraint (Relationship) with assembled primary key具有组装主键的外键约束(关系)
【发布时间】:2014-07-26 19:24:16
【问题描述】:

下面的例子用来说明我想要达到的目的。考虑一个包含用户的表格,以及另一个包含主题的表格。每个用户应该能够对每个主题进行评分(一次),但不需要对每个主题进行评分。这些是示例的示例表:

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。

【问题讨论】:

  • Vote 表的主键约束将保证唯一性。您可以为 topicId 和 userId 定义 2 个单独的外键约束。
  • 如果您想创建与Vote 的FK 关系,您需要使用Vote PK 中定义的both 列 - 您的子表需要两个 TopicID 和UserID。没有办法引用半个 PK... - 它要么涉及 ALL 列,要么没有 FK 关系。

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


【解决方案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)

【讨论】:

    猜你喜欢
    • 2020-03-17
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多