mysql约束是唯一的

b1zrtrql  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(309)

我有这张table:

create table expert_country (
    expert_id  varchar(36) not null,
    country_id varchar(36) not null,
    main       boolean     not null default false,
    primary key (expert_id, country_id),
    constraint foreign key (expert_id) references expert (id),
    constraint foreign key (country_id) references country (id),
    -- constraint i'm looking for
);

但我不知道我需要增加什么限制,每个国家只有一个主要Maven。
我试过了 constraint unique (country_id, true) 以及 constraint unique (*, country_id, true) 但它不是有效的sql。有什么想法吗?

6uxekuva

6uxekuva1#

您可以使用唯一键 null (遵循sql标准):任何包含 null 不等价于任何元组。也就是说,在一个唯一的索引中 (country_id, main) ,您可以拥有该行 (1, null) 你想多久就多久,最多一排 (1, 1) 还有一排 (1, 0) .
你需要允许 null 为了 main ,需要使用 1 以及 null (不是 0 )编码,如果它是一个Maven或不是(否则你只能有一个非Maven)。约束条件是:

main boolean null default null,
constraint unique index uidx_expert_country (country_id, main)

这可能需要对应用程序进行更改,可能看起来很粗略(如 false 显然不一样 null )可能会软化对列的解释(因为它现在可以包含3个值) null , 0 / false 以及 1 / true 尽管您可以通过对包含 1 ).
因此,如果您不想这样做,可以定义一个额外的列,该列将在触发器中或作为生成的列进行计算,然后在该“伪”列上定义一个唯一索引:

main boolean  not null default false,
main_unq  boolean as (if(main = true,true, null)) stored,
constraint unique index uidx_expert_country (country_id, main_unq)

对于一个国家的主要Maven是哪位Maven的信息的不同编码方式,您可以添加一个列 main_expert_id 给你的 country -表(以及 expert_country 验证该组合是否存在)并删除列 main .

相关问题