Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 约束表,使每个帐户可以有另一个表_Sql_Sql Server - Fatal编程技术网

Sql 约束表,使每个帐户可以有另一个表

Sql 约束表,使每个帐户可以有另一个表,sql,sql-server,Sql,Sql Server,我有一个包含以下列的表: Id(主键):Id OwnerId(外键):所有者的id,它位于另一个表中 TypeId(外键):此记录表示的类型。有有限数量的类型,它们在另一个表中表示。这将链接到该表 TypeCreatorId(ForeignKey):由TypeId表示的类型的所有者 SourceId(外键):这对这个问题并不重要 我需要约束这个表,这样对于每个Id,每个TypeCreatorId只能有一个。我希望这是有道理的 只需在OwnerId和TypeCreatorId上创建一个唯一索引

我有一个包含以下列的表:

  • Id
    (主键):Id
  • OwnerId
    (外键):所有者的id,它位于另一个表中
  • TypeId
    (外键):此记录表示的类型。有有限数量的类型,它们在另一个表中表示。这将链接到该表
  • TypeCreatorId
    (ForeignKey):由TypeId表示的类型的所有者
  • 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)
    之类的。