约束
约束
为什么要引入约束?
维护数据库的一致性
Oracle提供以下5种约束:
非空(NOT NULL)
唯一(UNIQUE)
主键(PRIMARY KEY)-- 维护实体完整性
外键(FOREIGN KEY)--用来维护主从表之间的引用完整性
条件(CHECK)
约束时添加在表上的,因为只有表中存有数据。可以在创建表的时候定义约束,也可以在已存在的标上利用ALTER TABLE语句来定义约束,可以在列级别定义约束,也可以在表级别定义约束。如果定义约束没有给名字,Oracle系统将为该约束自动生成一个名字,其格式为SYS_Cn,其中n为大于零的自然数。
非空约束:
例子:
CREATE TABLE deptcon(
deptno NUMBER(3),
dname VARCHAR2(15) NOT NULL,
loc VARCHAR2(20)
);
非空(NOT NULL)约束是唯一的一种智能在列一级定义的约束。
尝试插入数据:
INSERT INTO deptcon (deptno, dname, loc)
VALUES (20, '', 'GUANGZHOU'); --报错与非空约束冲突
UPDATE deptcon SET dname = ''; -- 报错,无法将NULL值插入指定列
查看有关约束的信息
根据数据字典USER_CONSTRAINTS来得到
SELECT owner, constraint_name, constraint_type, table_name
FROM user_constraints
WHERE table_name = UPPER('deptcon');
constraint_type中每个字母代表的含义:
C:代表CHECK(条件)
P: 代表PRIMARY KEY(主键)
R:代表REFERENTIAL INTEGRITY(FOREIGN KEY)
U: 代表UNIQUE(唯一)
查询约束信息,包含约束所在列
SELECT owner, constraint_name, table_name, column_name
FROM user_cons_columns;
唯一约束(UNIQUE)
ALTER TABLE deptcon -- 删除前面的非空
DROP CONSTRAINT SYS_C002719
SELECT owner, constraint_name, table_name, column_name -- 查看用户约束信息
FROM user_cons_columns;
ALTER TABLE deptcon -- 在dname列增加唯一约束
ADD CONSTRAINT deptcon_dname_uk UNIQUE(dname);
SELECT owner, constraint_name, constraint_type, table_name, search_condition
FROM user_constraints;
创建表时定义唯一约束:
CREATE TABLE table_name
(
column1 datatype null/not null,
column2 datatype null/not null,
...
CONSTRAINT constraint_name UNQUE(column1, column2,... column_n)
);
使用ALTER_TABLE语法创建唯一性约束:
ALTER TABLE table_name
ADD CONSTRAINT constraint_name
UNIQUE (column1, column2, ... column_n);
Oracle推荐的约束命名法:三部分组成:表名、列名和约束的类型,它们之间由下划线_连接。其中,约束的类型表示如下:
UK UNIQUE KEY
PK PRIMARY KEY
FK FOREIGN KEY
CK CHECK)
NN NOT NULL
UNIQUE约束允许插入一个空值NULL。允许插入多个空值。其他值的话不能重复。
条件约束(CHECK)
可以利用条件(CHECK)约束来实现公司中一些比较复杂的商业规则。条件约束定义了表中每一行数据都必须满足的条件。条件约束中的条件与查询语句中的条件相同,但是不能包括以下的内容:
CURRVAL,NEXTVAL,LEVEL,ROWNUM和ROWNUM这样的伪列。
引用其他值的查询语句
SYSDATE,USER,YSERENV和UID的函数调用
条件约束既可以在表一级定义也可以在列一级定义。在一列上可以定义任意多个条件约束
要求前台满足:1、女性 2、年龄在18~35之间 3、最好大学或者以上学历 4、相貌端庄 5、未婚
实现第一第二个条件:
CREATE TABLE person(
id VARCHAR2(10),
name VARCHAR2(20),
gender CHAR(1),
age NUMBER,
CONSTRAINT person_age_ck CHECK(gender = 'F'),
CONSTRAINT person_age_ck CHECK(age BETWEEN 18 AND 35)
);
创建表的时候定义CHECK约束:
CREATE TABLE table_name
(
column1 datatype null/not null,
column2 datatype null/not null,
...
CONSTRAINT constraint_name CHECK (column_name condition) [DISABLE]
);其中,DISABLE关键字是可选项。如果使用了DISABLE关键字,当CHECK约束被创建后,CHECK约束的限制条件不会生效
ALTER TABLE定义CHECK约束
ALTER TABLE table_name
ADD CONSTRAINT constraint_name CHECK (column_name condition) [DISABLE]
启用CHECK约束
ALTER TABLE table_name
BNABLE CONSTRAINT constraint_name
禁用CHECK约束
ALTER TABLE table_name
DISABLE CONSTRAINT constraint_name;
删除CHECK约束:
ALTER TABLE table_name
DROP CONSTRAINT constraint_name;
主键约束(PRIMARY KEY)
主键是关系型数据库中的一个非常重要的概念,您一旦在表中的某一列或者某几列上定义了主键(PRIMARY KEY),Oracle 系统就会自动的维护实体完整性
创建主键约束:
ALTER TABLE deptcon
ADD CONSTRAINT deptcon_deptno_pk
PRIMARY KEY (deptno);
不允许将NULL插入主键列
用户在表中创建主键或者唯一约束时,系统会自动地创建唯一索引(UNIQUE INDEX)。怎么找到它们呢?
SELECT INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
FROM user_indexes
WHERE table_name = 'DEPTCON';
SELECT index_name, table_name, column_name, column_position
FROM user_ind_columns
WHERE table_name = 'DEPTCON';
外键约束(FOREIGN KEY)
由于外键(FOREIGN KEY)约束是用来维护从表和主表之间的引用之间的引用完整性,所以外键约束要涉及到的不止一个表
创建外键约束:
ALTER TABLE empcon
ADD CONSTRAINT empcon_deptcon_fk
FOREIGN KEY(deptno) REFERENCES deptcon(deptno);
外键约束对INSERT语句的影响:
进行插入操作时,只有操作时在字表或者从表这一段时才会产生引用完整性的问题。
外键约束对DELETE语句的影响
在删除操作时,只有操作是在父表或者主表这一段才会产生违反引用完整性的问题
外键约束对UPDATE操作的影响
在进行修改操作时,操作无论是在父表还是在子表端都有可能产生违反引用完整性的问题。这时候我们可以借助中间变量达到效果
外键对约束DDL语句的影响
在删除整个表时,只有删除的是父表或主表时会产生违反引用完整性的问题
外键(FOREIGN KEY)的ON DELETE SET NULL和ON DELETE CASCADE 子句
ON DELETE SET NULL子句的作用是:当主表中的一行数据被删除时,Oracle系统会自动的将所有从表中依赖于它的数据记录的外键改成NULL
ON DELETE CASCADE在删除主表数据同时删除从表数据
ALTER TABLE empcon
ADD CONSTRAINT empcon_deptno_fk
FOREIGN KEY(deptno) REFERENCES deptcon(deptno)
ON DELETE SET NULL;
如果在外键的定义中使用了ON DELETE SET NULL 子句或者ON DELETE CASCADE 子句,无论删除操作时在父表还是在子表这一端都不会违反引用完整性,慎用,安全隐患。
约束的维护
Oracle约束过多会降低Oracle数据库系统的效率。
关闭约束的命令格式:
ALTER TABLE 表
DISABLE CONSTRAINT 约束名 [CASCADE]
其中CASCADE子句用来关闭存在有完整性关系的约束,DISABLE子句既可以用在CREATE TABLE 语句中,也可以用在ALTER TABLE 语句中。
打开约束的命令格式:
ALTER TABLE 表
ENABLE CONSTRAINT 约束名;
ENABLE子句即可以用在CREATE TABLE语句中,也可以用在ALTER TABLE语句中。如果您打开UNIQUE KEY或PRIMARY KEY约束,Oracle系统将自动的为UNIQUE KEY 或PRIMARY KEY建立索引。
删除约束的命令格式如下:
ALTER TABLE 表
DROP CONSTRAINT 约束名[CASCADE]
约束小结:
有些开发商或开发人员,几乎不再表上创建人和约束,包括主键和外键,为了避免DML或DDL操作时的冲突。当使用这些表时再用过程或者函数等来检查所需要的数据。这样的设计有如下弊端:
1、不能在错误一出现就发现,可能带来蝴蝶效应
2、无论过程还是函数,由开发人员编写,程序出错率可能比Oracle高
3、过程和函数存储次数明显高于Oracle的约束,可能拖累系统效率

浙公网安备 33010602011771号