【问题标题】:SQL Multiple Foreign Keys as Primary KeysSQL 多个外键作为主键
【发布时间】:2013-04-12 00:36:26
【问题描述】:

如果我声明下表是否隐含地暗示两个外键都是唯一的主键,还是我需要做更多的事情来使两个属性都成为主键?

CREATE TABLE Report_has_Items
(
    ReportID int REFERENCES Report(ReportID) NOT NULL,
    ItemID int REFERENCES Item(ItemID) NOT NULL
)

本质上,这两个属性都是来自其他表的外键,共同构成一个唯一键。

【问题讨论】:

    标签: sql sql-server sql-server-2008 foreign-keys composite-primary-key


    【解决方案1】:

    不,它没有。上表没有主键。如果您想将字段用作主键,请使用:

    CREATE TABLE Report_has_Items(
        ReportID int REFERENCES Report(ReportID) NOT NULL,
        ItemID int REFERENCES Item(ItemID) NOT NULL,
        PRIMARY KEY (ReportID, ItemID)
    )
    

    或类似的东西,取决于你的 sql 语言。

    【讨论】:

      【解决方案2】:

      让我们命名我们的约束,嗯?

      CREATE TABLE dbo.Report_has_Items(
          ReportID int NOT NULL,
             CONSTRAINT [FK_RHI_Report] (ReportId) REFERENCES dbo.Report(ReportID),
          ItemID int NOT NULL,
             Constraint [FK_RHI_Item] (ItemId) REFERENCES dbo.Item(ItemID),
          CONSTRAINT [PK_RHI] PRIMARY KEY (ReportID, ItemID)
      )
      

      【讨论】:

      • 命名约束有什么好处?
      • @Kairan - 一个主要好处是,如果查询(插入、更新、删除)违反了约束,则会生成带有约束名称的错误消息。如果约束名称清晰且具有描述性,则错误消息将更容易理解;如果约束名称是随机的,那就不太清楚了。
      • 对我来说主要原因是跨环境的一致性。我是支持 DBA。该工作的一部分是将更改从 DEV 迁移到 QA 到 PROD。我为此使用了模式比较工具。如果约束命名相同,这样命名的差异不会被标记为差异,那就太好了。
      • @Gayu 感谢您提供的信息。展望未来,我想我会这样做。
      【解决方案3】:

      我不确定我是否完全理解您的问题,但我假设您正在尝试创建复合主键(具有多个属性的主键)。您可以执行以下操作。

      CREATE TABLE Report_has_Items(
        ReportID int references Report(ReportID),
        ItemID int references Item(ItemID),
        PRIMARY KEY (ReportID , ItemID )
      );
      

      注意:这对 (ReportID , ItemID ) 对于表必须是唯一的,并且两个值都不能为 NULL。

      Here is a very useful link for SQL Queries

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-24
        • 1970-01-01
        • 2012-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-21
        • 1970-01-01
        相关资源
        最近更新 更多