浅谈数据库约束

国有国法 家有家规

其实很多时候技术和生活息息相关,怎样的需求就会有出来解决方案

数据库也是那么一个神奇的东西,毕竟是关系型数据库,数据独立而又可以表表关联,有时候就需要约束,在某些时候要规规矩矩做人做事,才能更有价值。

先谈谈约束

开篇是闲谈,约束的根本是保护数据库内数据的完整性,完整性就是数据的精确性和可靠性,那些数据库中的数据都符合某种定义规则,当不符合这些规则,就会操作失败。

主键是啥

主键防止同一个数据表中两端记录相同,保证了数据的完整性,通过主键查询返回只有一行的数据,而且主键一个表中只有一个(不要与多个字段一个主键搞混!),对于主键创造的人来说,他们的意识为了保证数据唯一的表示,与我们现实生活中很可能有一些差距。我们说一个班级可以有重复名字,但是主键意志是不允许的,它提示你重复,所以一般对于多个能够明确反映真实需求而违背主键意志,我们就把主键建立在多个列上(仍然是一个主键),这样就可以区分而来。我们理想的主键是id号,可以自动增长的那种,但是数据类型都可以成主键。

格式:

    Create table teacher(id number(10) not null primary key);

解释:

    创建一个主键,没有加选项自动增长.那么id这一列不可出现重复的值!

格式:

    Create table teacher1(id number(10) not null,name varchar2(20),constraint pk_one primary key (id,name));

解释:

    这个就是主键建立多个字段上,但是还是一个主键,那么插入的时候姓名不同,id可以相同,如一本书出版社是主键一样,书名不一样也是可以的,总有办法满足我们的需求。

格式:

    select table_name,constraint_name,constraint_type,status from user_constranints where table_name='TEACHER';--表明要大写,敏感区分大小写

    select constraint_name,table_name,status,column_name from user_cons_columns where table_name = 'TEACHER';

解释:

    一个查询约束基本信息,另一个视图查询约束建立在那一列上;

格式:

    alter table teacher add constraint pk_add primary key  (id,name);

解释:

    表已经创建好了,alter一看就知道对已存在的表进行操作语言,添加多个字段的主键

格式:

    alter table teacher modify (id number(10) primary key);

解释:

    为单列字段添加主键

格式:

    alter table teacher rename constraint pk_one to fk_teacher;--因为主键创建时候如果不用constraint关键字后指定主键名字(显示命名) 会自动生成主键名,对于我们毫无意义,我们需要根据自己需求来修改。

    alter table teacher drop primary key;--主键就一个表就一个所以关键字后不用指定主键名字

    alter table teacher disable primary key;--临时禁用主键 enbale开启

主键到底用于什么地方呢

当然我们数据完整性要求较高最好有主键,主键本质就是为了保证数据的完整性,其次就是我们总是用一段字段进行查询时候,主键是不二的选择,有些表需要和其他表关联而且有时需要同步更新这时候考虑是否便捷于外键!

什么是外键

主外主外,就像父子一样,外键更好的辅助主键保证数据的完整性,而且重要的是表与表之间的约束关系,插入外键表会检查主键字段的数据,删除,更新也都会进行校检。

格式:

    alter table student add constraint fk_student foreign key (student_id) references teacher (id);

解释

    创建一个名字为fk_student的外键,把学生表的id关联到来时的id上,就像一对一的家教,一个老师id可以对多个学生id

修改外键一些操作重命名啊,删除和修改都和主键格式大体相同不作啰嗦。

那么我们做更新删除老师表操作都会失败,因为已经被约束,所以没有办法在学生表删除前删除老师表,那么外键的值可以为空,可以重复的这都是没问题的。如果老师id更新,学生也该能更新id的,这时候级联更新/删除在这个大背景下就出场了。

级联更新删除

什么是级联更新删除操作呢,整体来说相互依赖牵扯,在修改主表的时候对应的外键表也会随之更新保证了数据的完整性。

级联更新涉及了数据的校检:1、及时校检 2、延迟校检 其实Oracle中没有直接实现更新,那么我可以在建立外键的时候设置为延迟校检,注意的是不意味着不校检,当commit事务提交后仍然会校检。

格式:

    alter table student add constraint fk_two foreign key (id) references teacher (id) deferable initially deferred;

解释:

    那么修改表student增加外键设置为deferable控制是否延迟校检,initially关键字选择有两个参数1、immediate 2、deferred两个。

格式:

    alter table student add constraint fk_three foreign key (id) references teacher (id) on delete cascad;

解释:

    那么这是级联删除的操作on delete cascad是关键字

格式:

    alter table student modify constraint id enable novalidate;

解释:

    这个其实很重要,为什么这因为当我们有些时候禁用了外键,插入一些数据之后发现无法开启外键因为数据完整性不一致,这时候用novalidate关键字,只对以后生成修改的数据进行检验,跳过之前插入的数据,而且只是临时的状态。

alter table student drop constraint 外键名字;--删除外键

外键到底干啥用那么从上面的语句也好分析也好只要在一些规格比较严谨的父子表格中是理想的选择,同样在应用程序中应该吧一些外键能做好的数据约束尽可能的转移到表的外键约束上,因为开发应用程序类于外键约束带来的变化很难把控的,同样也要禁止过分使用外键,会影响设计的可读性,而且大量的也会影响数据库的性能,对于大量的数据对象,还要为子对象建立对象并进行相应的处理。

唯一性约束

主键是表中唯一性保证,为什么还要有唯一性约束。

那么有一些场景,比如我们理想的表中id代号而且会自动增长的那种作为主键,但主键只有一个啊,为了业务等逻辑关系还需要格外的需求。比较严谨的说主键设计为了唯一性标识一条记录,唯一性设计为了约束为了保证列自身的唯一性值。

格式:

    alter table student add constraint un_one unique (列);

解释:

    关键字unique 其实看了那么多SQL约束语句我们会发现格式大同小异,禁用开启,修改名称都是一个框里赶出来

唯一性约束作为主键来补充

检查约束

介绍的最后一种约束,学过编程的朋友检查约束更好理解,就是代码流程的控制,按照我的意愿在操作数据库的时候进行检车,不符合将操作失败,那么Oracle中检车操作是计算布尔值来判断真假。

格式:

    Create table student (id number not nul primary key,grade varchar(20),sal number(20) not null,constraint chk_one chkeck (grade in ('老板','经理','技术工') and (grade='老板' and sal >=10000 or grade='经理' and sal <= 8000 or grade='技术工' and sal <= 5000 )));

解释:

    这个意思在创建时候有那么一个限制关系的需求,在grade老板数据的工资最低不能低10000,否则不成功,类似于我们if else等判断语句不知道是否能在and 使用函数如between指定范围约束,有待测试。

    还有禁用,重命名,删除等等格式不一一啰嗦,与上大同小异。

默认值约束

这个也很有意思,我们在不插入的字段中有些是nullable值,这就是我们的默认值,在Oracle 9i之前默认值只能常量值,在以后版本也可以系统函数如sysdata来作为默认值使用

格式:

    create table students (name varchar(20) default '默认值');

解释:

    取代nullable变成了字符串默认值显示,关键字default来指定默认值。

格式:

    select * from user_tab_column where table_name='STUDENT' and column_name='NAME';

解释:

    查看详细的内容(默认值)

格式:

    alter table student modify quantity name default '你好';

    alter table student modify quantity time default trunc(sysdate,'DD');--这是使用系统变量作为默认值,default trunce来指定重设默认值。

解释:

    修改列的默认值,quantity是指定列明

格式:

    alter table student modify quantity name default null;

解释:

    这是删除默认值的语句,略有不同所以单独介绍,其实就是恢复nullable值。

那么约束告一段落,其实那么多语句,仔细思考大体格式都是相同,记住各自的特色和关键字(英语好其实零难度),那么在后期的使用中加以运用深入理解,灵活掌握没问题的。

猜你喜欢

转载自blog.51cto.com/14284581/2379996