章节目标
- 通过本章学习,学员应达到如下目标:
- 理解约束的作用;
- 掌握五种类型的约束及含义;
- 掌握五种类型约束的创建方式;
- 了解约束的追加、删除及启用、禁用;
本章内容
数据库对象
表 | 表是用来存放用户数据的对象,由行和列组成,列就是字段,行就是表中的记录 |
约束 | 是一种保证数据完整性的规则。约束设置在单个字段或者多个字段组合上,写入这些字段的行数据必须要符合约束的规则。 |
视图 | 虚表,是一个命名的查询,用于改变基表数据的显示,简化查询。访问方式与表相同,同样可使用查询语句 |
索引 | 构建于表的单字段或者字段组合上,用于加速对表中数据的查询 |
序列 | 产生顺序的不重复数字串,被作为主键约束值的参照 |
同义词 | 数据库对象的别名 |
约束及作用
约束: 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;
本章重点总结
- 理解约束作用;
- 掌握五种约束类型及每种约束能达到的效果;
- 掌握在创建表的同时创建约束写法;
- 理解追加、删除、启用、禁用约束;
- 了解约束相关数据字典;
分割线
博主为咯学编程:父母不同意学编程,现已断绝关系;恋人不同意学编程,现已分手;亲戚不同意学编程,现已断绝来往;老板不同意学编程,现已失业三十年。。。。。。如果此博文有帮到你欢迎打赏,金额不限。。。