Oracle数据库的完整性约束规则详解
Oracle数据库的完整性约束规则详解
约束简介:
约束用于确保数据库数据满足特定的商业逻辑或者企业规则,如果定义了约束,并且数据不符合约束,那么DML操作(INSERT、UPDATE、DELETE)将不能成功执行。
完整性约束用于增强数据的完整性,Oracle提供了5种完整性约束:
Check
NOT NULL
Unique
Primary
Foreign key
完整性约束是一种规则,不占用任何数据库空间。完整性约束存在数据字典中,在执行SQL或PL/SQL期间使用。用户可以指明约束是启用的还是禁用的,当约束启用时,他增强了数据的完整性,否则,则反之,但约束始终存在于数据字典中。
* 如果某个约束只作用于单独的字段,即可以在字段级定义约束,也可以在表级定义约束,但如果某个约束作用于多个字段,必须在表级定义约束
* 在定义约束时可以通过CONSTRAINT关键字为约束命名,如果没有指定,ORACLE将自动为约束建立默认的名称
定义约束
列级约束:
column [CONSTRAINT constraint_name] constraint_type
表级约束:
column ,...,
[CONSTRAINT constraint_name] constraint_type (column,...)
check约束
* 在CHECK约束的表达式中必须引用到表中的一个或多个字段,并且表达式的计算结果必须是一个布尔值
* 可以在表级或字段级定义
* 对同一个字段可以定义多个CHECK约束,同时也可以定义NOT NULL约束
CREATE TABLE emp06(
eno INT,
name VARCHAR2(10),
salary NUMBER(6,2),
CHECK (salary BETWEEN 1000 AND 5000)
);
not null约束
只能在字段级定义NOT NULL约束,在同一个表中可以定义多个NOT NULL约束
NOT NULL约束应用在单一的数据列上,并且他保护的数据列必须要有数据值。缺省状况下,ORACLE允许任何列都可以有NULL值。某些商业规则要求某数据列必须要有值,NOT NULL约束将确保该列的所有数据行都有值。
CREATE TABLE emp01(
eno INT NOT NULL,
name VARCHAR2(10) CONSTRAINT nn_name2 NOT NULL, salary NUMBER(6,2)
);
unique约束
定义了UNIQUE约束的字段中不能包含重复值,可以为一个或多个字段定义UNIQUE约束,因此,UNIQUE即可以在字段级也可以在表级定义,在UNIQUED约束的字段上可以包含空值.
CREATE TABLE emp02(
eno INT UNIQUE,
name VARCHAR2(10) CONSTRAINT u_name UNIQUE,
salary NUMBER(6,2)
);
primary key约束
ORACLE自动会为具有PRIMARY KEY约束的字段(主码字段)建立一个唯一索引和一个NOT NULL约束,定义PRIMARY KEY约束时可以为它的索引,一张表最多只能具有一个主键约束
CREATE TABLE depto04(
dno INT PRIMARY KEY,
dname VARCHAR2(10),
loc VARCHAR2(20)
);
foreign key约束
* 定义为FOREIGN KEY约束的字段中只能包含相应的其它表中的引用码字段的值或者NULL值
* 可以为一个或者多个字段的组合定义FOREIGN KEY约束
* 定义了FOREIGN KEY约束的外部码字段和相应的引用码字段可以存在于同一个表中,这种情况称为"自引用"
* 对同一个字段可以同时定义FOREIGN KEY约束和NOT NULL约束
定义了FOREIGN KEY约束的字段称为"外部码字段",被FORGIEN KEY约束引用的字段称为"引用码字段",引用码必须是主码或唯一码,包含外部码的表称为子表,包含引用码的表称为父表.
CREATE TABLE emp04(
eno INT,
name VARCHAR2(10),
salary NUMBER(6,2),
dno INT CONSTRAINT fk_dno REFERENCES dept04(dno)
);