Oracle-约束

章节目标

  • 通过本章学习,学员应达到如下目标:
    • 理解约束的作用;
    • 掌握五种类型的约束及含义;
    • 掌握五种类型约束的创建方式;
    • 了解约束的追加、删除及启用、禁用;

本章内容

数据库对象

表是用来存放用户数据的对象,由行和列组成,列就是字段,行就是表中的记录
约束 是一种保证数据完整性的规则。约束设置在单个字段或者多个字段组合上,写入这些字段的行数据必须要符合约束的规则。
视图 虚表,是一个命名的查询,用于改变基表数据的显示,简化查询。访问方式与表相同,同样可使用查询语句
索引 构建于表的单字段或者字段组合上,用于加速对表中数据的查询
序列 产生顺序的不重复数字串,被作为主键约束值的参照
同义词 数据库对象的别名

约束及作用

  • 约束: Constraint,是定义在表上的一种强制规则。

  • 当为某个表定义约束后,对该表做的所有SQL操作都必须满足约束的规则要求,否则操作将失败。

约束类型

约束 说明
NOT NULL 非空约束,指定某列的所有行数据不能包含空值
UNIQUE 唯一性约束,指定列或者列的组合的所有行数据必须唯一
PRIMARY KEY 主键约束,表的每行的唯一性标识,指定列或者列的组合的所有行数据必须唯一
FOREIGN KEY 外键约束,在列及引用列上建立的一种强制依赖关系
CHECK 检查性约束,在列上指定一个必须满足的条件

约束命名规则

  • 约束也是数据库对象,必须按照命名规则命名,如果你不命名约束,Oracle服务器将用SYS_Cn格式产生一个名字,这里n是一个唯一的整数。

  • 除了NOT NULL约束外,建议给其它约束起名字,命名规则为:表名 _ 列名 _ 约束类型。

约束操作

  • 定义约束:约束通常在创建表的同时被创建;

  • 追加约束:在表被创建后,如果有需求也可以临时添加约束;

  • 启用及禁用约束:约束可以被临时禁用和启用。

定义约束

  • 定义约束语法
CREATE TABLE [schema.]table
(column1 datatype [DEFAULT expr]
         [CONSTRAINT constraint_name] constraint_type ],--列级别约束
column2 datatype [DEFAULT expr]
         [CONSTRAINT constraint_name] constraint_type ],--列级别约束
  ……
 [CONSTRAINT constraint_name] constraint_type]--表级别约束
        );
  • 其中:
    • 约束既可以写在每个对应列的后面,称之为列级别约束,一个列级别约束只能作用在一个列上;
    • 也可以写完所有列之后,再写约束,称之为表级别约束,一个表级别约束既可以作用在一个列上,也可以作用在列的组合上;
    • NOT NULL约束只能定义在列级别上,联合主键或联合唯一性约束只能定义在表级别上,其它约束既可以定义成表级别,也可以定义成列级别;
    • 列级别约束和表级别约束达到的作用完全相同,只是书写的位置不同;
    • CONSTRAINT:约束的关键字;constraint_name:约束名字;constraint_type:约束的类型;

NOT NULL 约束

  • NOT NULL约束 :也叫非空约束,确保被约束列的所有行记录都不能为空值。
  • NOT NULL约束只能定义在在列级上。
SQL> CREATE TABLE emp_nn(
  2     empno   NUMBER(4),
  3 ename   VARCHAR2(10) NOT NULL,
  4 job VARCHAR2(9),
  5 mgr NUMBER(4),
  6 hiredate    DATE,
  7 sal NUMBER(7,2),
  8     comm    NUMBER(7,2),
  9 deptno  NUMBER(7,2) NOT NULL);
  • 例子里应用NOT NULL约束到emp_nn表的ename,deptno列,因为对这两个列的约束未被命名,Oracle服务器将为它创建名字。

  • 在指定约束时,也可以指定约束的名字:... ename VARCHAR2(20) CONSTRAINT emp_ename_nn NOT NULL...

UNIQUE 约束

  • UNIQUE约束:也叫唯一约束,用来确保表中的某一列或者某几列组合的所有行数据必须唯一,定义UNIQUE约束的列 (或列组合) 被称为唯一键。
  • 每个表可以有多个为UNIQUE约束。
  • 可以定义在列一级:
SQL> CREATE TABLE   deptment(
  2     deptno    NUMBER(2),
  3 dname     VARCHAR2(14) CONSTRAINT
  4                  dept_dname_uk UNIQUE,
  5 loc   VARCHAR2(13)
  6 );
  • 也可以定义在表一级:
SQL> CREATE TABLE   deptment(
  2     deptno    NUMBER(2),
  3 dname     VARCHAR2(14),
  4 loc   VARCHAR2(13),
  5 CONSTRAINT dept_dname_uk UNIQUE(dname));
  • UNIQUE约束允许输入空值,除非我们在相应的列上定义NOT NULL 约束。

PRIMARY KEY 约束

  • PRIMARY KEY约束:主键约束,用来确保表中的某一列或者某几列组合的所有行数据必须唯一,并且确保作为主键一部分的列不能包含空值;
  • 每个表只能创建一个主键约束。
  • 可以定义在列一级
SQL> CREATE TABLE   deptment(
  2     deptno    NUMBER(2) CONSTRAINT dept_deptno_pk 
  3                           PRIMARY KEY,
  4 dname     VARCHAR2(14),
  5 loc   VARCHAR2(13),
  6 CONSTRAINT dept_dname_uk UNIQUE (dname)
  7 );
  • 也可以定义在表一级
SQL> CREATE TABLE   deptment(
  2     deptno    NUMBER(2),
  3 dname     VARCHAR2(14),
  4 loc   VARCHAR2(13),
  5 CONSTRAINT dept_dname_uk UNIQUE (dname),
  6 CONSTRAINT dept_deptno_pk PRIMARY KEY(deptno));

FOREIGN KEY 约束

  • FOREIGN KEY,也叫外键约束,外键确保了相关联的两个字段的关系:

    • 外键列的值必须在引用列值的范围内,或者为空;
    • 外键参照的是列必须是主键或者唯一键;
  • 主键表主键值被外键表参照时,主键表记录不允许被删除。

  • 可以定义在列一级
SQL> CREATE TABLE emp_fk1(
  2     empno   NUMBER(4),
  3 ename   VARCHAR2(10) NOT NULL,
  4 job VARCHAR2(9),
  5 deptno  NUMBER(7,2) NOT NULL 
  6 CONSTRAINT emp_deptno_fk REFERENCES dept (deptno),
  7      sal number(7,2)
  8    );
  • 也可以定义在表一级
SQL> CREATE TABLE emp_fk2(
  2     empno   NUMBER(4),
  3 ename   VARCHAR2(10) NOT NULL,
  4 deptno  NUMBER(7,2) NOT NULL,
  5 CONSTRAINT emp_deptno_fk FOREIGN KEY (deptno)
  6         REFERENCES dept (deptno) 
  7     ON DELETE CASCADE 
  8  );
  • FOREIGN KEY: 定义在子表的列中

  • REFERENCES: 引用列所在的父表

  • 注:

    • ON DELETE CASCADE:当父表中的行被删除时,子表中相依赖的行同时被删除;
    • ON DELETE SET NULL:当父表的行被删除时,子表中相依赖的行被转换为空值;
    • 无ON DELETE CASCADE或ON DELETE SET NULL选项,当附表中的行被删除时,如果父表中的行在子表中被引用,则提示不能被删除。

CHECK 约束

  • CHECK约束,也叫检查性约束,确保某个列的所有行数据都必须满足的条件,如:

    • sal NUMBER(8,2) CONSTRAINT dept_sal_min CHECK (sal> 0)

    • 要求sal字段的所有行数据必须大于0

  • 表达式不允许使用:

    • 伪列,例如: CURRVAL, NEXTVAL, LEVEL及 ROWNUM;
    • 可以调用SYSDATE, UID, USER及 USERENV 函数;
    • 对其它记录其它值的查询。
  • 可以定义在列一级

SQL> CREATE TABLE emp_fk3(
  2     empno   NUMBER(4),
  3 ename   VARCHAR2(10) NOT NULL,
  4 deptno  NUMBER(7,2) 
  5 CONSTRAINT emp_deptno_ck CHECK(deptno between 10 and 99),
  6      sal number(7,2)
  7    );
  • 也可以定义在表一级
SQL> CREATE TABLE emp_fk4(
  2     empno   NUMBER(4),
  3 ename   VARCHAR2(10) NOT NULL,
  4 deptno  NUMBER(7,2) NOT NULL,
  5      sal      NUMBER(7,2),
  6 CONSTRAINT emp4_deptno_ck 
  7           CHECK(deptno between 10 and 99) 
  8  );

追加约束

  • 也可以用ALTER TABLE语句为表:
    • 追加或删除约束,但不修改它的结构;
    • 启用或禁用约束;
    • 用MODIFY子句添加一个NOT NULL约束;
  • 追加约束,语法为:
ALTER TABLE table ADD [CONSTRAINT constraint] type (column);
  • 在语法中:
    • table 是表的名字
    • constraint 是约束的名字
    • type 是约束的类型
    • column 是受约束影响的列的名字
  • 追加FOREIGN KEY约束
ALTER TABLE table 
    ADD [CONSTRAINT constraint] FOREIGN KEY(column)
     REFERENCES table(column));
  • 例:在emp表中的mgr上添加一个外键约束,指示该列的值必须引用emp表中的empno值。
ALTER TABLE emp
    ADD CONSTRAINT emp_mgr_fk FOREIGN KEY(mgr) 
    REFERENCES emp (empno);
  • 追加 NOT NULL 约束
ALTER TABLE table 
    MODIFY (column [CONSTRAINT constraint] NOT NULL);

删除约束

  • 语法
ALTER TABLE table DROP PRIMARY KEY|UNIQUE(column)
|CONSTRAINT constraint [CASCADE];
  • 在语法中:
    • table 是表的名字
    • column 是受约束影响的列的名字
    • constraint 是约束的名字
    • cascade 级联删除
  • 例:从emp表中删除emp_mgr_fk约束
ALTER TABLE emp DROP CONSTRAINT emp_mgr_fk;
  • 例:删除dept表上的PRIMARY KEY约束,并且删除相关联的在emp表deptno上的FOREIGN KEY约束;
ALTER TABLE dept DROP PRIMARY KEY CASCADE;
  • DROP子句的CASCADE选项导致任何与其相依赖的约束也被删除。

约束启用与禁用

  • 约束禁用
    • 如果有大批量数据导入时,我们可以采用禁用约束的方法,主要的好处,首先效率高,另外有主外键约束的表之间导入时,不用考虑导入的先后顺序。
    • 禁用约束语法:
ALTER TABLE table  DISABLE CONSTRAINT constraint [CASCADE]; 
  • 应用CASCADE选项禁用相依赖的外键约束

  • 启用约束语法:

ALTER TABLE table  ENABLE CONSTRAINT constraint; 

相关数据字典

  • 相关数据字典
    • 和约束相关的数据字典有:USER_CONSTRAINTS:查看表上所有的约束。USER_CONS_COLUMNS:查看与约束相关的列名,该字典对于那些由系统指定名字的约束特别有用。
    • 在约束类型中,C代表CHECK,P代表PRIMARY KEY,R代表FOREIGN KEY, U代表UNIQUE,NOT NULL约束实际上是一个CHECK约束。
select constraint_name,constraint_type 
from user_constraints; 

本章重点总结

  • 理解约束作用;
  • 掌握五种约束类型及每种约束能达到的效果;
  • 掌握在创建表的同时创建约束写法;
  • 理解追加、删除、启用、禁用约束;
  • 了解约束相关数据字典;

分割线


博主为咯学编程:父母不同意学编程,现已断绝关系;恋人不同意学编程,现已分手;亲戚不同意学编程,现已断绝来往;老板不同意学编程,现已失业三十年。。。。。。如果此博文有帮到你欢迎打赏,金额不限。。。

你可能感兴趣的:(Oracle-约束)