一个表中 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
create table zcz (id number not null,name varchar(20) null, age varchar(20) null);
创建主键 或者联合主键 但一个表中只能有一个主键
alter table zcz add constraints zcz_pk primary
今天在开发过程中遇到了需要两个字段联合保证唯一性,所以查阅了一些资料和博客,梳理一下以便之后用到!!!
首先,你要搞明白什么是唯一索引和唯一约束,其次它们之间的区别是什么?
二者的定义
唯一索引:一种索引,不允许具有索引值相同的行,从而禁止重复的索引或键值。系统在创建该索引时检查是否有重复的键值,并在每次使用 INSERT 或 UPDATE 语句添加数据时进行检查。 唯一约束:唯一约束保证在一个字段或者一组字段里的数据与表中其它行的数据相比是唯一的(联合字段中,可以包含...
使用oracle数据库建表的时候,涉及到删除往往是逻辑删除,一般的做法就是将某条记录的active字段设置为‘N’,这也就是所谓的逻辑删除。如员工表,员工工号(code)一般是唯一的,但是员工职位可以变化,那么就会出现多条记录,但是只会有一条记录的active为‘Y’,其余的都为‘N’,这样就不能在code这个字段上加唯一索引。实际的情况是如果active为‘Y’那么code和active=‘Y’...
CREATE TABLE tb_month_report_chapter_main(`id` INTEGER(11) NOT NULL AUTO_INCREMENT,`record_month` char(7) NOT NULL ,`customer_id` int(11) NOT NULL,PRIMARY KEY(`id`),UNIQUE KEY `record_month` (`record_...
主键用于标识和区分表中每一行记录,而唯一键用于确保某个字段或字段组合的值是唯一的。需要注意的是,主键和唯一键的选择应根据具体的业务需求和数据模型来决定。如果需要确保某个字段或字段组合的值在表中是唯一的,但允许为空值,则可以选择唯一键。主键和唯一键是关系数据库中两个重要的概念,它们用于确保数据表中的数据的唯一性和完整性。在Oracle数据库中,主键和唯一键都是用于标识和区分表中的记录的。在上述示例中,我们创建了一个名为"students"的表,并将"student_id"字段指定为唯一键。