将多个主键添加到 table
Add multiple primary keys to a table
我有一个 table 主键可用;我想在primary里再加一个但是加不上
SRNO
TRNDATE
RATE
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);
我得到一个错误:
Msg 1779, Level 16, State 0, Line 1
Table 'avgEnt' already has a primary key defined on it.
Msg 1750, Level 16, State 0, Line 1
Could not create constraint or index. See previous errors.
当我打开 table 的设计并添加主键 (SRNO, TRNDATE)
时,它工作正常。
当我尝试使用查询添加时,它不起作用。
设计时发生了什么windows保存我想要的那个时间脚本。
我的数据库版本是SQL Server 2014。
您不能更改主键。唯一的方法是删除它然后重新创建它。
ALTER TABLE avgEnt DROP PRIMARY KEY, ADD PRIMARY KEY(srno,trndate);
一个table不能有多个PRIMARY KEY
,这是不允许的,没有变通办法。这是设计使然。
但是,一个 table 可以有多个 UNIQUE INDEX
或 UNIQUE CONSTRAINT
。这些与 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
,意味着可以保持数据的完整性。
否则,正如我在评论中提到的,您可以将 table 拆分为 2 个 table,然后使用复合键管理关系的第三个 table .所以使用 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
可以很好地实现目标。如果您想对一对一关系使用多个 table 解决方案,您可能还需要将 UNIQUE INDEX
添加到 ID
和 AnotherIdentifier
列中 dbo.PrimaryTableLink
,这提出了一个问题,你为什么不先在 dbo.PrimaryTable
中的原始列上创建 said INDEX
?
我找到了一个解决方案。
select OBJECT_NAME(OBJECT_ID) AS NameofConstraint
FROM sys.objects
where OBJECT_NAME(parent_object_id)='avgEnt'
and type_desc LIKE '%CONSTRAINT'
查找 table PK_avgent
的约束条件
在 table
上删除小学后
-- 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
这是我的作品。
我有一个 table 主键可用;我想在primary里再加一个但是加不上
SRNO | TRNDATE | RATE | 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);
我得到一个错误:
Msg 1779, Level 16, State 0, Line 1
Table 'avgEnt' already has a primary key defined on it.Msg 1750, Level 16, State 0, Line 1
Could not create constraint or index. See previous errors.
当我打开 table 的设计并添加主键 (SRNO, TRNDATE)
时,它工作正常。
当我尝试使用查询添加时,它不起作用。
设计时发生了什么windows保存我想要的那个时间脚本。
我的数据库版本是SQL Server 2014。
您不能更改主键。唯一的方法是删除它然后重新创建它。
ALTER TABLE avgEnt DROP PRIMARY KEY, ADD PRIMARY KEY(srno,trndate);
一个table不能有多个PRIMARY KEY
,这是不允许的,没有变通办法。这是设计使然。
一个 table 可以有多个 UNIQUE INDEX
或 UNIQUE CONSTRAINT
。这些与 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
,意味着可以保持数据的完整性。
否则,正如我在评论中提到的,您可以将 table 拆分为 2 个 table,然后使用复合键管理关系的第三个 table .所以使用 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
可以很好地实现目标。如果您想对一对一关系使用多个 table 解决方案,您可能还需要将 UNIQUE INDEX
添加到 ID
和 AnotherIdentifier
列中 dbo.PrimaryTableLink
,这提出了一个问题,你为什么不先在 dbo.PrimaryTable
中的原始列上创建 said INDEX
?
我找到了一个解决方案。
select OBJECT_NAME(OBJECT_ID) AS NameofConstraint
FROM sys.objects
where OBJECT_NAME(parent_object_id)='avgEnt'
and type_desc LIKE '%CONSTRAINT'
查找 table PK_avgent
在 table
上删除小学后-- 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
这是我的作品。