[英]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.PrimaryTable
的ID
列,因為它是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
上的ID
和AnotherIdentifier
列,這提出了為什么不創建 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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.