none
怎样在数据表中建立这样的联合唯一或联合主键约束?例如A字段为1的行,B字段的内容无论一不一样,这些行都不会发生主键冲突,若A字段为0的行,B字段出现相同内容就会发生主键冲突? RRS feed

  • 问题

  • 例如下列表格

       Name,type

         a       1

         a       1

         b       1

         b       1

         a       0

         b       0

         c        0

         a       0

    这个假设的数据表中,

    • type字段为0的行,要求Name字段内容不能相同,相同就会发生主键冲突。
    • type字段为1的行,字段Name内容可以重复且不发生主键冲突。
    • type字段不同内容的行出现Name字段的相同内容也不会发生冲突。
    • type的类型是固定的,不会出现0和1以外的数字。

    这样的联合唯一约束或联合主键约束要怎么建立?


    2017年5月11日 4:45

答案

  • 主键/唯一约请是做不到的,它们本来就是要求唯一,而不是按条件唯一

    唯一索引可以,因为索引可以设置筛选条件,所以你歌词考虑用带条件的唯一索引,对需要保持唯一的部分做唯一性限制 

    type字段为0的行,要求Name字段内容不能相同,相同就会发生主键冲突。
    -- 用带条件的唯一索引
    CREATE UNIQUE INDEX xx ON tb(name) WHERE type = 0;
    type字段为1的行,字段Name内容可以重复且不发生主键冲突。
    -- 不需要限制
    type字段不同内容的行出现Name字段的相同内容也不会发生冲突。
    -- 如果 type 不是 0/1, 也要保持 type+name 唯一,则仍然可以创建带条件的唯一索引
    CREATE UNIQUE INDEX xxx ON tb(type, name) WHERE type NOT IN( 0, 1);

    2017年5月11日 9:46

全部回复

  • Hi 便携式家园,


    第四个要求type的类型是固定的,不会出现01以外的数字。,可以使用SQL CHECK 约束,

     

    ALTER TABLE [Table_name]

    ADD CONSTRAINT CK_name CHECK(type = 0 or type = 1)

     

    对于前三个要求,直接设置主键并不可行,我们可以设置一个instead of的触发器。

     

    Best Regards,

    Teige

     


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年5月11日 6:51
    版主
  • 主键/唯一约请是做不到的,它们本来就是要求唯一,而不是按条件唯一

    唯一索引可以,因为索引可以设置筛选条件,所以你歌词考虑用带条件的唯一索引,对需要保持唯一的部分做唯一性限制 

    type字段为0的行,要求Name字段内容不能相同,相同就会发生主键冲突。
    -- 用带条件的唯一索引
    CREATE UNIQUE INDEX xx ON tb(name) WHERE type = 0;
    type字段为1的行,字段Name内容可以重复且不发生主键冲突。
    -- 不需要限制
    type字段不同内容的行出现Name字段的相同内容也不会发生冲突。
    -- 如果 type 不是 0/1, 也要保持 type+name 唯一,则仍然可以创建带条件的唯一索引
    CREATE UNIQUE INDEX xxx ON tb(type, name) WHERE type NOT IN( 0, 1);

    2017年5月11日 9:46
  • 也不是一定做不到,做个持久化的计算列建唯一索引就是了。

    当然,filtered index和check是正解。


    想不想时已是想,不如不想都不想。

    2017年5月12日 5:54
    版主