oracle的联合约束(多个字段的唯一性)
2012-12-05 14:36
106 查看
简单的唯一性约束的方法
一个表中 2个字段的联合约束创建数据表
create table zcz (id number not null,name varchar(20) null, age varchar(20) null);
创建主键 或者联合主键 但一个表中只能有一个主键
alter table zcz add constraints zcz_pk primary key (id);
alter table zcz add constraints zcz_name_age primary key (name,age);
创建联合约束(下面该条sql的作用是name和age不能同时相等)
CREATE UNIQUE INDEX zcz_name_age ON zcz(NVL2(name,age,NULL),NVL2(name,name,NULL));
比较复杂的唯一性约束的方法
今天在做表约束修改的时候遇到一个系统需求,假设在同一张表 T 中,有 a,b,c 三个字段,另外有主键已经定义好的,现在要求,只要当符合 b<>3 的条件的时候,a,b,c 三个字段联合唯一,解决方法如下:创建表的唯一性索引
CREATE UNIQUE INDEX idx_ut ON t(NVL2(NULLIF(b,3),a,NULL),NVL2(NULLIF(b,3),b,NULL),NVL2(NULLIF(b,3),c,NULL));
解析:当 b=3 时,NULLIF(b,3) 则返回null值, 即NVL2(NULLIF(b,3),a,NULL), 返回的是null值,同理,另外两个NVL2的表达式也是返回null值,因此,三个字段都认为是null值,所以可以允许插入;
当 b<>3 时,NULLIF(b,3)则返回 b 值,即NVL2(NULLIF(b,3),a,NULL),返回的值是a字段的值,同理,另外两个NVL2的表达式返回的分别是b,c字段的值,这时候进行判断是否符合唯一性约束。
NULL指的是空值,或者非法值。
NVL (expr1, expr2)->expr1为NULL,返回expr2;不为NULL,返回expr1。注意两者的类型要一致
NVL2 (expr1, expr2, expr3) ->expr1不为NULL,返回expr2;为NULL,返回expr3。expr2和expr3类型不同的话,expr3会转换为expr2的类型
NULLIF (expr1, expr2) ->相等返回NULL,不等返回expr1
相关文章推荐
- oracle的联合约束(多个字段的唯一性)
- oracle的联合约束(多个字段的唯一性)
- oracle的联合约束(多个字段的唯一性)
- oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息
- oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息
- oracle数据 在已有的重复的数据上加联合唯一约束
- MySQL 表字段唯一性约束设置方法, 设置字段自增的方法
- Oracle之唯一性约束(UNIQUEConstraint)用法详解
- oracle联合查询并更新一个表字段的sql语句
- Oracle 数据库中关于对表字段约束的操作(设置、删除、查询)
- Oracle之唯一性约束(UNIQUE Constraint)用法详解
- Oracle:查找表的主键,外键,唯一性约束,索引
- MYSQl 联合唯一约束 根据两个字段 唯一
- Oracle之唯一性约束(UNIQUEConstraint)用法详解
- oracle唯一性约束和索引(转)
- Oracle之唯一性约束(UNIQUEConstraint)用法详解
- Oracle:查找表的主键,外键,唯一性约束,索引
- 为Oracle 和 MSSQL 数据库表里的字段添加约束
- mysql 字段添加唯一性约束
- oracle查询表, 索引,唯一约束,字段