oracle中约束的使用

版权声明:本人原创文章,如需转载,还请注明出处。 https://blog.csdn.net/jin_tk/article/details/88696043

什么是约束

约束是强加在表上的规则或条件。它能够保证数据库满足业务规则,保证数据的完整性(正确性与一致性)。当对表进行数据库操作时,违反了这些规则,数据库就会拒绝执行。

在ORACLE中,数据完整性可以使用约束、触发器、应用程序(过程、函数)三种方法来实现,其中约束易于维护,并且具有最好的性能。

约束是必须的吗

约束分为五种,这里简单列举下,后面详细介绍使用方法。 一般来说,除了主键约束这种几乎每个表都用到的约束,像其它约束如外键约束、检查约束,更多的是一种概念设计,因为数据库约束会使得处理不够方便,更多的时候出现在数据库设计过程中,真正的企业开发中较少用到,更多的是放到程序中去实现。对于设计合理的产品,出于性能考虑,约束可有可无,但对于关联关系复杂的系统,数据的完整性高于性能要求,,那么约束必不可少,很好的防止无效的脏数据进入数据库。

约束命名规范

约束名称建议自己定义一套命名规则,否则使用系统生成的约束名,很难能把它和对应的表、字段联系起来。

非空约束     NN_表名_列名

唯一约束     UK_表名_列名

主键约束     PK_表名

外键约束     FK_表名_列名

条件约束     CK_表名_列名

默认约束     DF_表名_列名

如果约束名称超过32位长度,建议应该缩写表名,而不应用NN_表名_数字。不过具体视情况而定,很多时候 DF_表名_列名 这样命名,往往超出了32字符。所以有时候需要缩写表名或是采用其它规则。

约束分类

  • 非空(NOT NULL)约束

非空约束作用的列也叫强制列,就是该列中必须有值,建表时候若使用default关键字指定了默认值,可不输入。

//指定默认值(也叫默认约束)
alter table 表名 add constraint 约束名称 default 10000 for 列名;
//添加非空约束,语法较特别
alter table 表名 modify 列名 not null;
  • 主键(PRIMARY KEY)约束

要对一个列加主键约束的话,这列就必须要满足的条件就是非空。
每个表只能有且有一个主键约束。
因为主键约束就是对一个列进行了约束,约束为(非空、不重复)。

//格式
alter table 表名 add constraint 约束名称 PRIMARY KEY (列名);
  • 唯一性约束(UNIQUE)

给列的数据追加的不重复的约束类型,该列值虽然是不能重复的,但是可以为null。

alter table 表名 add constraint 约束名称 UNIQUE (列名);
  • 检查约束(CHECK)

检查约束可用来实施一些简单的规则,比如列值必须在某个范围内。检查的规则必须是一个结果为true或false 的表达式。
条件约束既可以在表一级定义也可以在列一级定义。在一列上可以定义任意多个条件约束。

alter table 表名 add constraint 约束名称 check(表达式);
例:
alter table emp add constraint emp_sex_ck check(sex in('男','女'));
  • 外键约束(FOREIGN KEY)

外键约束定义在具有父子关系的子表中,外键约束使得子表中的约束列对应父表的主键列,能很好的维护数据库的完整性。
外键约束的子表中的列和对应父表中的列数据类型必须相同,列名可以不同。
对应的父表列必须存在主键约束(PRIMARY KEY)或唯一约束(UNIQUE)。
外键约束列允许NULL值,对应的行就成了孤行了。
外键约束是个有争议性的约束,它一方面能够维护数据库的数据一致性,数据的完整性。防止错误的垃圾数据入库; 另外一方面它会增加表插入、更新等SQL性能的额外开销,不少系统里面通过业务逻辑控制来取消外键约束。

alter table 引用的表名 add constraint 约束名称 FOREIGN KEY (列名) references 被引用的表名 (列名);

举个栗子:
有两个表,STUDENT(学生表)的唯一id对应GRADE(成绩表)的学号。其实就是成绩表的学号去引用学生表的身份证号。

-- Create table学生表(身份证号,姓名)
create table STUDENT
(
  id   VARCHAR2(10) not null,
  name VARCHAR2(10)
);
-- Create/Recreate primary, unique and foreign key constraints (主键约束)
alter table STUDENT add constraint PK_STUDENT primary key (ID);
-- Create table 学生成绩表(学号,分数)
create table GRADE
(
  idcard VARCHAR2(10),
  point  VARCHAR2(10)
);
-- Create/Recreate primary, unique and foreign key constraints (外键约束)
alter table GRADE add constraint PK_GRADE_IDCARD foreign key (IDCARD)  
references STUDENT (ID);

REFERENCES:该选项用于指定主表名及其主键列。当定义外部键约束时,该选项必须指定。
设计外键的表之间删除问题始终困扰着我们,尤其是新手,这里简单介绍下。常见问题如下图。当主从表删除数据时,只有从表中没有了主表对应的数据才可以删除主表数据。这种情况只能是找到该主表的外键约束,进而将对应的从表数据全部删除,可能一对一也可能一对多。这样才可以删除主表数据。
在这里插入图片描述
这种情况可以在创建外键约束的时候进行优化,有两种,这样就在删除操作时不会出现报错。ON DELETE CASCAED:用于指定级联删除。如果在定义外部键约束时指定了该选项,那么当删除主表数据时会级联删除从表的相关数据。
ON DELECT SET NULL:用于指定转换相关的外部键值为NULL,如果在定义外部键约束时指定了该选项,那么当删除主表数据时会将从表外部键列的数据设置为NULL。

但是对于这两个子句,一定要慎用,如果在创建外键约束时使用了这两个子句,那么删除主表数据时都会级联删除或修改从表的数据,一定程度上存在安全隐患。

//on delete cascade 子句
alter table GRADE add constraint PK_GRADE_IDCARD foreign key (IDCARD)  
references STUDENT (ID) on delete cascade;
//on delete set null 子句
alter table GRADE add constraint PK_GRADE_IDCARD foreign key (IDCARD)  
references STUDENT (ID) on delete set null;

待补充…

猜你喜欢

转载自blog.csdn.net/jin_tk/article/details/88696043
今日推荐