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差不多而已。嘿嘿,有点自大,但是也是信心的来源,不错不错,革命尚未成功,同志仍需努力。。。