如何使用SQL在一个主键中创建2个字段?

时间:2015-12-16 18:43:39

标签: sql sql-server

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

示例:

enter image description here

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

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

5 个答案:

答案 0 :(得分:5)

您需要在末尾声明参与主键的列

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

答案 1 :(得分:1)

SQL语法:

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

答案 2 :(得分:1)

在SQL Server中,Identity列不是自动主键,因此您只需执行此操作:

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

答案 3 :(得分:1)

好的,首先,如果Orderid是Order表的FK,那么您不希望它成为订单详细信息表中的标识列。标识将为每个明细行提供不同的值,您将希望orderid与以相同顺序排序的所有产品相关联。此外,如果您尝试将它们关联起来,那么它们将与错误的订单相关,因为您没有从订单表中提取值。由于订单详细信息将包含比订单表更多的记录,因此您将快速耗尽已在订单表中使用的ID,并且根本无法插入记录。

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

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

答案 4 :(得分:0)

订单详情[Pk OrderID] [FK CustomerID]                           产品ID(1:很多)客户可以拥有一个订单ID到多个ProductID。 UnitpriceГpurchase的SQL =(字段)(1:很多)。