簡體   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