Oracle 数据库添加主键和unique约束

时间:2024-02-19 18:34:06

Oracle一直用了将近四年了,但是从没有做过数据库设计,所以到目前为止还是在和select,update 和delete,alter 打交道,当然创建表也是能操作的。但是对表的约束确实了解甚少。

除了知道主键是唯一性约束,并且创建主键就Oracle自动创建主键索引外,其余知之甚少。今天要建一张表,主键是sequence,但是还有其他几个重要的字段,templateid,decltype,customflow,要是不能重复的。所以隐约记起oracle中有unique这个关键字。所以找文档学来看看。

首先,建表:

create table custtempdelc(

 unid    number(18),

 templateid  varchar2(50),

description  varchar2(300)

customdecltype varchar(50),

customflow varchar(50),

partyid  varcahar(10)

) using tablespace als_data2;

 接着创建主键:

alter table custtempdelc add constraint primary key PK_CUSTTEMPDECL using tablespace als_index2;

下来就是创建 unique了;

alter table  custtempdelc add constraint  unique UK_CUSTTEMPDECL  using tablespace als_index2;

执行玩上面语句后,去查看已经创建好的表,在check中发现了两项,一个是PK的约束,还有一个是UK的约束,接着查看index,发现有两个index,一个是unid,还有一个则是创建unique的几个字段。

但是虽然学会创建unique,依然搞不清楚为什么要创建unique,他和pk有什么本质区别,为什么还要建一个uk字段组成的索引,在数据检索时,是优先使用那个索引呢?

带着这样的疑问又开始了百度和google。但是只得到以下答案,虽然不是我问的,但是也是我不知道的,所以记录在案以备忘。

PK 和 unique的区别:

1.PK字段必须是not null的,虽然在建表时没有将pk字段设置为not null,但是在创建PK后,oracle会自动给PK字段加上not null check。unique的字段可是null的。

2.一张表的PK只能有一个,但是unique却可以多个,以方便创建不同字段组合的唯一性约束。

3.对于给unique插入数据,如果是数值都不是null,那么数据是不可重复的,但是如果数据是null,那么可以插入重复的null数据,oracle在处理一条记录全部是空值时,自动忽略,所以空值的unique数据是可以重复的。(待测试,unique字段为空,pk不重复的数据是否能够插入)。

 

创建玩主表之后,开始建子表:

create table custtempdelcdetail(

templateid  number(18),

sno            number(18),

nodemane   varchar(100),

value          varchar(400)

) using tablespace als_data2;

子表主键:

alter table custtempdelcdetail add constraint primary key PK_CUSTTEMPDECLDETAIL using tablespace als_index2;

因为是主从表关系,所以为子表创建外键,约束数据完整性,即从表有和主表关联的数据,主表的该条数据不能被删除。

alter table custtempdelcdetail add constraint foreign key FK_CUSTTEMPDECLDETAIL (templateid) refrences custtempdecl (unid);

这次使用之后对主键外键和unique有了比较清晰的认识,虽然还有问题要挖掘,但是它们不再只是个熟悉的名词了,也没有那么多敬畏心里,原来了解了也是和select delete差不多而已。嘿嘿,有点自大,但是也是信心的来源,不错不错,革命尚未成功,同志仍需努力。。。