Sql 约束表,使每个帐户可以有另一个表
我有一个包含以下列的表:Sql 约束表,使每个帐户可以有另一个表,sql,sql-server,Sql,Sql Server,我有一个包含以下列的表: Id(主键):Id OwnerId(外键):所有者的id,它位于另一个表中 TypeId(外键):此记录表示的类型。有有限数量的类型,它们在另一个表中表示。这将链接到该表 TypeCreatorId(ForeignKey):由TypeId表示的类型的所有者 SourceId(外键):这对这个问题并不重要 我需要约束这个表,这样对于每个Id,每个TypeCreatorId只能有一个。我希望这是有道理的 只需在OwnerId和TypeCreatorId上创建一个唯一索引
(主键):IdId
(外键):所有者的id,它位于另一个表中OwnerId
(外键):此记录表示的类型。有有限数量的类型,它们在另一个表中表示。这将链接到该表TypeId
(ForeignKey):由TypeId表示的类型的所有者TypeCreatorId
(外键):这对这个问题并不重要SourceId
我需要约束这个表,这样对于每个Id,每个TypeCreatorId只能有一个。我希望这是有道理的 只需在
OwnerId
和TypeCreatorId
上创建一个唯一索引即可
使用MySQL的示例(对不起,我不使用SQL Server):
示例。我将在这里说明这个新的唯一索引会发生什么:
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
只需在
OwnerId
和TypeCreatorId
上创建一个唯一索引
使用MySQL的示例(对不起,我不使用SQL Server):
示例。我将在这里说明这个新的唯一索引会发生什么:
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
对于SQL Server,您有两个选项:
唯一约束
ALTER TABLE dbo.YourTable
ADD CONSTRAINT UNIQ_Id_TypeCreator UNIQUE(Id, TypeCreatorId)
唯一索引
:
CREATE UNIQUE INDEX UIX_YourTable_ID_TypeCreator
ON dbo.YourTable(Id, TypeCreatorId)
基本上,这两种方法可以实现相同的效果-不能有两行具有相同的
(Id,TypeCreatorId)
值。对于SQL Server,您有两个选项:
唯一约束
ALTER TABLE dbo.YourTable
ADD CONSTRAINT UNIQ_Id_TypeCreator UNIQUE(Id, TypeCreatorId)
唯一索引
:
CREATE UNIQUE INDEX UIX_YourTable_ID_TypeCreator
ON dbo.YourTable(Id, TypeCreatorId)
基本上,这两种方法实现了相同的功能-您不能有两行具有相同的
(Id,TypeCreatorId)
值。非常感谢!为了确认,这将允许多个OwnerId,但不允许多个OwnerId和TypeCreatorID相同,对吗?@Jack我已经编辑了我的答案,包括OwnerId
字段(我认为这是您需要的),并添加了一个小示例。非常感谢!为了确认,这将允许多个OwnerId,但不允许多个OwnerId和TypeCreatorID相同,对吗?@Jack我已经编辑了我的答案,包括OwnerId
字段(这是我认为您需要的),并添加了一个小示例。如果我用OwnerId替换Id,这同样的方法会起作用吗,因为OwnerId不是主键,虽然它是主键的外键,但这可能无关紧要。@Jack:您可以(几乎)在任何列上创建唯一约束或唯一索引-它根本不必是主键列。不支持非常大的列,如varbinary(max)
或诸如此类。如果我将Id替换为OwnerId(虽然它是主键的外键,但它不是主键),那么同样的方法是否有效。@Jack:您可以在(几乎)上创建唯一约束或唯一索引任何列-它根本不必是主键列。不支持真正大的列,比如varbinary(max)
之类的。