繁体   English   中英

向表中添加多个主键

[英]Add multiple primary keys to a table

我有一个可用主键的表; 我想在主要中添加另一个但不能添加它。

SRNO TRNDATE 速度 AMT
1个 08-02-2022 120 120
2个 09-02-2022 170 170
3个 10-02-2022 180 180

我想将列Trndate添加到主键。

当我尝试添加主要的以下代码时

ALTER TABLE dbo.avgEnt 
ADD CONSTRAINT PK_avgent PRIMARY KEY NONCLUSTERED (srno, trndate);

我得到一个错误:

消息 1779,16 级,State 0,第 1 行
表“avgEnt”已经定义了一个主键。

消息 1750,16 级,State 0,第 1 行
无法创建约束或索引。 查看以前的错误。

当我打开表的设计并添加主键(SRNO, TRNDATE)时,它工作正常。

当我尝试使用查询添加时,它不起作用。

设计 windows 保存我想要的时间脚本时发生了什么。

我的数据库版本是 SQL Server 2014。

一个表不能有多个PRIMARY KEY s,这是不允许的,没有解决方法。 这是设计使然。

但是,一个表可以有多个UNIQUE INDEX es 或UNIQUE CONSTRAINT s。 这些与PRIMARY KEY不同,但提供类似的功能,并且很可能提供您需要的解决方案。 作为UNIQUE INDEX一部分的一列(或一组列)也可以是FOREIGN KEY的目标,如果您“需要”第二个PRIMARY KEY这样您就可以将它用作FOREIGN KEY那么这也满足那个要求。

例如,您可能有这样的事情:

CREATE TABLE dbo.PrimaryTable (ID int IDENTITY,
                               SomeValue varchar(10) NULL,
                               AnotherIdentifier uniqueidentifier NOT NULL
                               CONSTRAINT PK_PrimaryTable PRIMARY KEY (ID));

CREATE UNIQUE INDEX UQ_PrimaryTable_AnotherIdentifier ON dbo.PrimaryTable (AnotherIdentifier);
GO

CREATE TABLE dbo.SecondaryTable (ID int IDENTITY,
                                 PrimaryID int NOT NULL,
                                 AnotherValue decimal(12,2) NOT NULL,
                                 CONSTRAINT PK_SecondaryTable PRIMARY KEY (ID),
                                 CONSTRAINT FK_SecondaryTable_PrimaryTable FOREIGN KEY (PrimaryID) REFERENCES dbo.PrimaryTable (ID));
GO

CREATE TABLE dbo.AnotherTable (ID int IDENTITY,
                               AnotherID uniqueidentifier NOT NULL,
                               OtherValue int NOT NULL,
                               CONSTRAINT PK_AnotherTable PRIMARY KEY (ID),
                               CONSTRAINT FK_SecondaryTable_PrimaryTable_AnotherIdentifier FOREIGN KEY (AnotherID) REFERENCES dbo.PrimaryTable (AnotherIdentifier));
GO

所以在这里你可以看到dbo.SecondaryTable使用dbo.PrimaryTableID列,因为它是FOREIGN KEY ,然而, dbo.AnotherTable使用AnotherIdentifier列,即使它不是PRIMARY KEY 这是因为该列上有一个UNIQUE INDEX ,这意味着可以保持数据的完整性。

否则,正如我在评论中提到的,您可以将表拆分为 2 个表,然后使用带有复合键的第 3 个表来管理关系。 所以使用dbo.PrimaryTable你可能有这样的东西:

CREATE TABLE dbo.PrimaryTable (ID int IDENTITY,
                               SomeValue varchar(10) NULL,
                               CONSTRAINT PK_PrimaryTable PRIMARY KEY (ID));

CREATE TABLE dbo.AnotherPrimaryTable (AnotherIdentifier uniqueidentifier NOT NULL,
                                      CONSTRAINT PK_AnotherPrimaryTable PRIMARY KEY (AnotherIdentifier));
GO
CREATE TABLE dbo.PrimaryTableLink (ID int NOT NULL,
                                   AnotherIdentifier uniqueidentifier NOT NULL,
                                   CONSTRAINT PK_PrimaryTableLink PRIMARY KEY (ID,AnotherIdentifier),
                                   CONSTRAINT FK_PrimaryTableLink_PrimaryTable FOREIGN KEY (ID) REFERENCES dbo.PrimaryTable (ID),
                                   CONSTRAINT FK_PrimaryTableLink_AnotherPrimaryTable FOREIGN KEY (AnotherIdentifier) REFERENCES dbo.AnotherPrimaryTable (AnotherIdentifier));

你使用哪个取决于你。 这更多取决于您的设计和要求。 如果您需要多对多关系,我可能只会使用后者,因为对于一对一, UNIQUE INDEX可以很好地实现目标。 如果您想将多表解决方案用于一对一关系,您可能还需要将UNIQUE INDEX es 添加到dbo.PrimaryTableLink上的IDAnotherIdentifier列,这提出了为什么不创建 said 的问题在dbo.PrimaryTable中的原始列上的INDEX首先?

我找到了一个解决方案。

select OBJECT_NAME(OBJECT_ID) AS NameofConstraint
FROM sys.objects
where OBJECT_NAME(parent_object_id)='avgEnt'
and type_desc LIKE '%CONSTRAINT'

查找表PK_avgent的约束

在表上删除主要之后

-- drop current primary key constraint
ALTER TABLE dbo.avgEnt
DROP CONSTRAINT PK_avgent;
GO

添加两列后

-- create new primary key constraint
ALTER TABLE dbo.avgEnt
ADD CONSTRAINT PK_avgent PRIMARY KEY NONCLUSTERED (SrNo, TrnDate);
GO

这是我的工作。

您不能更改主键。 唯一的方法是删除它然后重新创建它。

ALTER TABLE avgEnt DROP PRIMARY KEY, ADD PRIMARY KEY(srno,trndate);

https://www.db-fiddle.com/f/BQuEjw2pthMDb1z8NTdHv/0也检查一下

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM