代码之家  ›  专栏  ›  技术社区  ›  Vicens Fayos

将空值作为有效行的唯一约束

  •  0
  • Vicens Fayos  · 技术社区  · 6 年前

    嗨,我在一个批处理过程中插入了一组数据。

    最终输出应该是这样的一个表。注意这里 Name, Address_id 这对是独一无二的。 Address_id 不能为空,但对于给定的对只能为一次 姓名、地址

    Name    address_id
    ———      —————
    “Richard”   1
    “Richard”   2
    “Richard”   NULL
    “Richard    3
    “James”     1
    “James”     2
    “James”     NULL
    “James”     3
    

    但我不能保证这对情侣在 address_id 是空的。另一对 (“Richard”, NULL) 如果我添加一个 INDEX UNIQUE (name, address_id)

    然后,如果我添加以下索引(发现它在谷歌搜索)

    CREATE UNIQUE INDEX index_employers_on_name_and_address_id 
        ON employers(name, address_id) 
        WHERE address_id IS NOT NULL
    
    
    CREATE UNIQUE INDEX index_employers_on_name 
        ON employers(name) 
        WHERE address_id IS NULL 
    

    全部 (<NAME>, NULL) 不允许成对,因为已经存在唯一的名称

    有什么想法?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Gordon Linoff    6 年前

    该指数:

    CREATE UNIQUE INDEX index_employers_on_name 
        ON employers(name) 
        WHERE address_id IS NULL ;
    

    是一个 部分索引 只有当 address_id is null . 只允许一个 NULL 每个值 name . 非 无效的 值为 address_id 对唯一性没有影响。

    这似乎是你想要的。