浅谈数据库约束

国有国法 家有家规

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

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

先谈谈约束

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

主键是啥

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

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

原文地址:https://blog.51cto.com/14284581/2379996

时间: 2024-10-08 20:47:30

浅谈数据库约束的相关文章

浅谈数据库设计技巧(转)

说到数据库,我认为不能不先谈数据结构.1996年,在我初入大学学习计算机编程时,当时的老师就告诉我们说:计算机程序=数据结构+算法.尽管现在的程序开发已由面向过程为主逐步过渡到面向对象为主,但我还是深深赞同8年前老师的告诉我们的公式:计算机程序=数据结构+算法.面向对象的程序开发,要做的第一件事就是,先分析整个程序中需处理的数据,从中提取出抽象模板,以这个抽象模板设计类,再在其中逐步添加处理其数据的函数(即算法),最后,再给类中的数据成员和函数划分访问权限,从而实现封装. 数据库的最初雏形据说源

浅谈数据库设计

浅谈数据库设计 数据库设计的重要性:好的数据库设计有下面的一些作用: 1.首先充分体现系统的需求,数据库是为应用服务的,好的数据库设计应该首先能满足应用系统的业务需求,准确的表达数据间关系. 2.保证数据的准确性和一致性,通过主外键.非空.限制.唯一索引等保证数据的健壮. 3.提高数据的查询效率,通过合理表结构,安排物理存储分区.增加索引等方式,提高数据的读取速度,提高查询效率. 4.有好的扩展性,在必要时能根据需求扩展数据结构. 在系统设计中对数据库的设计应考虑哪些设计原则  数据库是整个软件

浅谈数据库之存储过程

浅谈数据库之存储过程 什么是存储过程 如果你接触过其他的编程语言,那么就好理解了,存储过程就像是方法一样. 竟然他是方法那么他就有类似的方法名,方法要传递的变量和返回结果,所以存储过程有存储过程名有存储过程参数也有返回值. 存储过程的优点:    存储过程的能力大大增强了SQL语言的功能和灵活性. 可保证数据的安全性和完整性. 通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全. 通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性. 在运行存储过程前,

浅谈数据库框架,见笑,请多指正

浅谈数据库框架,见笑,请多指正 http://weibo.com/p/1001603724746155003486 一友说"插件式存储又割裂了SQL引擎的完整逻辑...总体而言在现有框架下MySQL的优化器没有多大改进的价值". 我们且做个技术分析: 1 插件式框架,可以静态/动态加载组件,方便在同类不同属家的模块间切换,这种设计是良好的. 很多软件的设计都采用了"微内核+插件"这样的方式构筑了强大的应用.如Ecplise生态圈. 2 数据库范围内, MySQL的属

浅谈数据库去重

关于sql去重,我简单谈一下自己的简介,如果各位有建议或有不明白的欢迎多多指出.推荐网址:www.4-yecao.com 关于sql去重最常见的有两种方式:DISTINCT和ROW_NUMBER(),当然了ROW_NUMBER()除了去重还有很多其他比较重要的功能,一会我给大家简单说说我自己在实际中用到的. 假如有张UserInfo表,如下图: 现在我们要去掉完全重复的数据:SELECT DISTINCT * FROM dbo.UserInfo结果如下图: 但是现在有个新的需求,要把名字为‘张三

浅谈数据库并发控制 - 锁和 MVCC

在学习几年编程之后,你会发现所有的问题都没有简单.快捷的解决方案,很多问题都需要权衡和妥协,而本文介绍的就是数据库在并发性能和可串行化之间做的权衡和妥协 - 并发控制机制. 如果数据库中的所有事务都是串行执行的,那么它非常容易成为整个应用的性能瓶颈,虽然说没法水平扩展的节点在最后都会成为瓶颈,但是串行执行事务的数据库会加速这一过程:而并发(Concurrency)使一切事情的发生都有了可能,它能够解决一定的性能问题,但是它会带来更多诡异的错误. 引入了并发事务之后,如果不对事务的执行进行控制就会

浅谈数据库的锁

数据库对于程序猿来 并不陌生,但是数据库的锁你知道多少?数据库的锁直接影响数据性能,在大并发的前提下,怎么保证数据不被死锁,提高数据库性能?如何加锁,何时加锁,加什么锁,你可以通过hint手工强行指定,但大多是数据库系统自动决定的.这就是为什么我们可以不懂锁也可以写SQL. 下面我们来简单谈一谈数据库中的锁,以sqlserver 为例: 数据库锁的种类: 1.共享锁(Shared lock) 何为共享锁,顾名思义意思就是资源共享,所以共享锁之间 是没有时间等待的可以同时执行一条或多条查询语句,共

浅谈数据库的完整性

数据库操作的时候必须要实现数据库的完整性,在实现数据库的完整性的时候,有两种方式都可以实现数据库的完整性,第一种是通过完整性的约束实现数据库的完整性,第二种就是通过用户创建自定义的触发器实现数据库的完整性. 一.完整性约束实现数据库的完整性 (一)主键约束 谈到主键约束的话,我就通过几个例子来实现创建主键约束 (1) 对student表添加主键约束 alter table student add constraint PK1 primary key(sno) (2) 对sc表添加主键约束 alt

浅谈数据库--事务(mysql)

事务   事务其实是一组对数据库增删改操作的组合,可以这样来理解,当你往某个人身上打1000元的时候,在数据库中会发生两个改变,一个是你的钱减少了,另一个是那个人的钱增加了,这两个操作必须同时满足,不然问题就大了,怎样保证两个操作全部执行,这就需要mysql事务的支持. mysql是支持事务的,但首先确认你是InnoDB存储引擎 mysql事务是为了维护数据库的完整性,堆成批量的语句要么全部执行,要么全部不执行.一般用来管理insert delete 和update语句的. 事务的特点: 1.事