iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >浅谈数据库约束
  • 288
分享到

浅谈数据库约束

2024-04-02 19:04:59 288人浏览 独家记忆
摘要

国有国法 家有家规其实很多时候技术和生活息息相关,怎样的需求就会有出来解决方案数据库也是那么一个神奇的东西,毕竟是关系型数据库,数据独立而又可以表表关联,有时候就需要约束,在某些时候要规规矩矩做人做事,才能

国有国法 家有家规

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

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


先谈谈约束

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

主键是啥

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

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

您可能感兴趣的文档:

--结束END--

本文标题: 浅谈数据库约束

本文链接: https://www.lsjlt.com/news/41141.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • sql怎么查看表的索引
    通过查询系统表,可以获取表的索引信息,包括索引名称、是否唯一、索引类型、索引列和行数。常用系统表有:mysql 的 information_schema.statistics、postg...
    99+
    2024-05-14
    mysql oracle
  • sql怎么查看索引
    您可以使用 sql 通过以下方法查看索引:show indexes 语句:显示表中定义的索引列表及其信息。explain 语句:显示查询计划,其中包含用于执行查询的索引。informat...
    99+
    2024-05-14
  • sql怎么查看存储过程
    如何查看 sql 存储过程的源代码:使用 show create procedure 语句直接获取创建脚本。查询 information_schema.routines 表的 routi...
    99+
    2024-05-14
  • sql怎么查看视图表
    要查看视图表,可以使用以下步骤:使用 select 语句获取视图中的数据。使用 desc 语句查看视图的架构。使用 explain 语句分析视图的执行计划。使用 dbms 提供...
    99+
    2024-05-14
    oracle python
  • sql怎么查看创建的视图
    可以通过sql查询查看已创建的视图,具体步骤包括:连接到数据库并执行查询select * from information_schema.views;查询结果将显示视图的名称、...
    99+
    2024-05-14
    mysql
  • sql怎么用循环语句实现查询
    可以通过 do 和 while 语句创建循环,并在循环内执行查询,详细步骤包括:定义循环变量设置循环初始值循环执行查询更新循环变量执行查询循环退出条件 SQL 中使用循环语句实现查询 ...
    99+
    2024-05-14
  • sql怎么用代码修改表中数据
    通过 sql 代码修改表中数据的方法包括:修改单个记录:使用 update 语句设置列值并指定条件。修改多条记录:在 update 语句中指定多个条件来修改满足条件的所有记录。增加新列:...
    99+
    2024-05-14
  • sql怎么用命令创建数据库
    在 sql 中使用 create database 命令创建新数据库,其语法包含以下步骤:指定数据库名称。指定数据库文件和日志文件的位置(可选)。指定数据库大小、最大大小和文件增长(可选...
    99+
    2024-05-14
  • sql怎么用身份证提取年龄
    sql 中提取身份证号码中的年龄的方法:提取出生日期部分(身份证号码中第 7-14 位);使用 to_date 函数转换为日期格式;使用 extract 函数计算与当前日期之间的年差。 ...
    99+
    2024-05-14
  • sql怎么看字段长度
    有两种方法可查看 sql 中的字段长度:使用 information_schema 架构,其中包含元数据信息,可用于查询字段长度。使用内建函数,如 length(),其适用于字符串数据类...
    99+
    2024-05-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作