联合约束主键 2020-08-27

在做表约束的时候,需要多个字段进行关联来确定唯一索引:

create index 索引名 on 表名(字段1, 字段2);

上述只是简单的两个字段作为索引,如果此时需要再加一个常见的is_del作为联合约束主键,即当is_del<>1的时候和其他字段一起作为主键:

CREATE UNIQUE INDEX 索引名 ON 表名
(
    NVL2(NULLIF(is_del,1),字段1,NULL),
    NVL2(NULLIF(is_del,1),is_del,NULL),
    NVL2(NULLIF(is_del,1),字段2,NULL)
);

解析:

1)当 is_del=1 时,NULLIF(is_del,1) 则返回null值, 即NVL2(NULLIF(is_del,1),字段1,NULL), 返回的是null值,同理,另外两个NVL2的表达式也是返回null值,因此,三个字段都认为是null值,所以可以允许插入;

2)当 is_del<>1 时,NULLIF(is_del,1)则返回 is_del 值,即NVL2(NULLIF(is_del,1),字段1,NULL),返回的值是字段1的值,同理,另外两个NVL2的表达式返回的分别是is_del,字段2的值,这时候进行判断是否符合唯一性约束。

3)NULL指的是空值,或者非法值。
NVL (expr1, expr2)->expr1为NULL,返回expr2;不为NULL,返回expr1。注意两者的类型要一致
NVL2 (expr1, expr2, expr3) ->expr1不为NULL,返回expr2;为NULL,返回expr3。expr2和expr3类型不同的话,expr3会转换为expr2的类型;

 

所以对于需要两个字段+一个字段特定值,组成的联合约束主键,可以使用上述方法进行创建。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值