【问题标题】:How can I make 2 fields in one primary key with SQL?如何使用 SQL 在一个主键中创建 2 个字段?
【发布时间】:2015-12-16 18:43:39
【问题描述】:

例如,我的 OrderID 表中的 OrderID 和 ProductID 充当单个主键。我只是不确定如何使用 SQL 来做到这一点。

例子:

CREATE TABLE [Order Details]
(
[OrderID] [int] IDENTITY(1,1) NOT NULL,
[ProductID] [int] NOT NULL,
...
)

我可以简单地将 PRIMARY KEY 添加到 NOT NULL 之后的两行以使它们成为主键吗?

【问题讨论】:

  • 顺便说一句,如果你用空格创建这个表名,你会永远讨厌自己。切勿在表格或其他对象名称中添加空格或保留字,因为这样您总是必须在它们周围放置 {}。

标签: sql sql-server


【解决方案1】:

需要在最后声明参与主键的列

CREATE TABLE [Order Details]
(
[OrderID] [int] NOT NULL,
[ProductID] [int] NOT NULL,
...,
PRIMARY KEY(OrderID, ProductID)
)

【讨论】:

    【解决方案2】:

    SQL 语法:

    ALTER TABLE <TABLE> ADD CONSTRAINT <PK_NAME> PRIMARY KEY (<COLUMN1>,<COLUMN2>);
    

    【讨论】:

      【解决方案3】:

      在 SQL Server 中,标识列不会自动成为主键,因此您只需这样做:

      CREATE TABLE [Order Details]
      (
      [OrderID] [int] IDENTITY(1,1) NOT NULL,
      [ProductID] [int] NOT NULL,
      ...
      constraint pk_OrderProductID primary key (OrderID,ProductID)
      )
      

      【讨论】:

        【解决方案4】:

        首先,如果 Orderid 应该是 Order 表的 FK,那么您不希望它成为订单详细信息表中的标识列。身份将为每个详细信息行提供不同的值,并且您希望 orderid 与以同一订单订购的所有产品相关联。此外,如果您尝试将它们关联起来,那么它们将与错误的订单相关,因为您没有从订单表中提取值。而且由于订单明细会比订单表有更多的记录,你会很快用完订单表中已经使用过的id,根本无法插入记录。

        Orderid 和产品 id 之间的复合 PK 仅当您不能在详细信息表中出现两次相同的产品 id 时才有效。例如,我想订购一本寄给我的杂志,并以相同的顺序订购相同的杂志作为礼物送给我母亲。两者都将具有相同的产品 ID 但不同的详细信息,因此最终可能需要在详细信息表中具有不同的行。就像我想要一件相同款式的粉色毛衣和一件黑色毛衣一样。如果某些变量详细信息不同,则可能取决于您的产品 ID 是否不同。或者也许我想要两个,但有两种不同的尺寸(所以我可以送一个作为礼物并保留一个)。所以这好不好PK不是我们能告诉你的,要看数据的含义和业务规则,只有你的业务才能为你解答。根据您的产品的存储方式,您的产品 ID 是如何确定的(例如,如果它们是由其他供应商设置的,那么您将有有限的资源来更改它们)将取决于您是否可以拥有除了自动生成的 id 作为 pk 之外的任何东西。

        如果是这样 - 即使您没有自然键,您仍然想创建一个 PK;如果数据库无法确定要更新的记录,则很难进行更新。在这种情况下,您添加一个自动生成的 OrderDrtailId。请确保仍将作为 FK 的 Orderid 和 ProductID 字段保留到其各自的父表中。

        【讨论】:

          【解决方案5】:

          订单详情 [ Pk OrderID] [ FK CustomerID] Product ID (1:many) 客户可以有一个订单 ID 到多个 ProductID。 UnitpriceГpurchase= (Fields) (1:many) 的 SQL。

          【讨论】:

            猜你喜欢
            • 2011-06-19
            • 2015-09-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多