我有一个包含这些列的表:
Id
(主键):id。OwnerId
(外键):所有者的id,驻留在另一个表中。TypeId
(外键):这个记录所代表的事物的类型。有有限数量的类型,它们在另一个表中表示。这链接到该表。TypeCreatorId
(ForeignKey):TypeId所代表的类型的拥有者。SourceId
(外键):这对这个问题并不重要。
我需要约束这个表,使得对于每个 Id,每个 TypeCreatorId 只能有一个。我希望这是有道理的!
我有一个包含这些列的表:
Id
(主键):id。OwnerId
(外键):所有者的id,驻留在另一个表中。TypeId
(外键):这个记录所代表的事物的类型。有有限数量的类型,它们在另一个表中表示。这链接到该表。TypeCreatorId
(ForeignKey):TypeId所代表的类型的拥有者。SourceId
(外键):这对这个问题并不重要。我需要约束这个表,使得对于每个 Id,每个 TypeCreatorId 只能有一个。我希望这是有道理的!
对于 SQL Server,您有两种选择:
创建一个UNIQUE CONSTRAINT
ALTER TABLE dbo.YourTable
ADD CONSTRAINT UNIQ_Id_TypeCreator UNIQUE(Id, TypeCreatorId)
创建一个UNIQUE INDEX
:
CREATE UNIQUE INDEX UIX_YourTable_ID_TypeCreator
ON dbo.YourTable(Id, TypeCreatorId)
基本上,这两件事都达到了同样的目的——你不能有两行具有相同的(Id, TypeCreatorId)
值。
OwnerId
只需在和上创建一个唯一索引TypeCreatorId
。
使用 MySQL 的示例(对不起,我不使用 SQL Server):
alter table yourTable
add unique index idx_newIndex(OwnerId, TypeCreatorId);
例子。我将在这里说明这个新的唯一索引会发生什么:
OwnerId | TypeCreatorId
--------+--------------
1 | 1
1 | 2 -- This is Ok
2 | 1 -- Ok too
2 | 2 -- Ok again
1 | 2 -- THIS WON'T BE ALLOWED because it would be a duplicate