在sql server中的一个表上是否有可能有两个PK?

时间:2018-03-14 07:22:11

标签: sql sql-server

enter image description here

我真的很惊讶该表有两个PK列。

当我尝试在另一列上添加PK时,那两个PK列正常更改,只有一列更改为PK。

以下是给出的脚本

ALTER TABLE [dbo].[ProductionPlaning] ADD  CONSTRAINT [PK_ProductionPlaning] PRIMARY KEY CLUSTERED 
(
    [ProductionPlaningId] ASC,
    [Date] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

4 个答案:

答案 0 :(得分:4)

根据定义,主键是唯一标识数据库表中记录的一个或多个字段。因此,同一个表不能有两个单独的主键。

如果您只是希望该字段是唯一的,只需通过向其添加唯一约束即可将其设为唯一字段ALTER TABLE YourTableNAme ADD UNIQUE (Date);

如果您希望ProductionPlanningId和Date都是表格的唯一标识符;你制作一个复合主键:

ALTER table TABLE_NAME
 ADD CONSTRAINT [name of your PK, e.g. PK_TableName] PRIMARY KEY CLUSTERED(column1, column2, etc.)

答案 1 :(得分:3)

创建脚本描述了这种情况。

ALTER TABLE [dbo].[ProductionPlaning] ADD  CONSTRAINT [PK_ProductionPlaning] PRIMARY KEY CLUSTERED 
(
    [ProductionPlaningId] ASC,
    [Date] ASC
)

如您所见,PK由两列(ProductionPlaningIdDate)创建,因此表中没有多个不同的PK。这是不可能的。

答案 2 :(得分:1)

表永远不会有多个主键。但是,主键可以包含多个列。在您的示例中,主键由多个列组成。

答案 3 :(得分:0)

主键定义为具有以下属性的一个或多个列:

  1. 值的组合是唯一的。
  2. 这些值都不是NULL。
  3. 只有一个这样的集合被称为“主要”。
  4. 其他集合称为候选主键。表格可以包含任意数量的候选人,您甚至可以将其声明为NOT NULLUNIQUE。但是,“主键”中的表示“一个”。

    默认情况下,SQL Server实际上使用主键对数据页上的数据进行排序(这称为“群集”索引)。数据只存储一次,因此只能进行一次排序,进一步强调主键的唯一性。

    那就是说,你的问题实际上是关于复合主键。这些是具有多个列的主键。通常,我避免使用复合主键,而是将合成标识列作为主键。但是,它们肯定是允许的,有时也很有用。