Chapter10 约束限制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OCP-007-Chapter10 约束限制
目的
完成本课,可以完成下列事情:
描述约束
创建和管理约束
约束在表一级实施强制的规则,可以防止误删除和误插入
有下列类型的约束:
NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK
所有的约束都保存在数据字典中。如果没有给约束起名,系统自己会起一个类似于SYS_C n的名字。可以从USER_CONTRAINS中查看已经定义的约束。
CREATE TABLE [schema.]table
(column datatype [DEFAULT expr]
[column_constraint],
...
[table_constraint][,...]);
列一级的约束:column [CONSTRAINT constraint_name] constraint_type
表一级的约束:
column,...
[CONSTRAINT constraint_name] constraint_type
(column, ...)
表一级不能定义NOT NULL约束
对于组合的唯一性约束,只能用于表一级
Oracle服务器隐式的创建了一个唯一性索引来保证UNIQUE约束
Primary Key可以在列一级和表一级定义,组合的Primary Key只能在表一级定义。一个表只能有一个Primary Key。当创建Primary Key约束时,一个唯一索引会自动在该列创建。
FOREIGN KEY(外键,也称为参照完整性约束),指定一列或者一个列的组合作为外键,和同一张表或者不同表中的primary key或者unique key建立关系。外键所在的表称为子表,所参考的表称为父表。在列一级定义外键时不出现foreign key字样。
外键的值必须在主键上已经存在,或者为NULL
外键是基于数据值的,纯粹是逻辑上的关系,不是物理的,也不是指针
CREATE TABLE employees
(...
department_id NUMBER(4) CONSTRAINT emp_deptid_fk
REFERENCES departments(department_id),
...
) --列一级
CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)
REFERENCES departments(department_id) --表一级
ON DELETE CASCADE:当父表中的行删除时,子表中的相应行也删除
ON DELETE SET:当父表中的行删除时,自表中相应行设为NULL
CHECK约束不允许下列表达式:
CURRVAL, NEXTVAL, LEVEL, and ROWNUM伪列
对系统SYSDATE, UID, USER, and USERENV函数的调用
对表中其他行或者列的查询
添加约束
ALTER TABLE table
ADD [CONSTRAINT constraint] type (column);
添加或者删除一个约束,不是更改它的定义;启用或者禁用约束;使用MODIFY子句来添加NOT NULL约束,且此时要求该列每一行都有值或者是个空表。
ALTER TABLE employees
ADD CONSTRAINT emp_manager_fk
FOREIGN KEY(manager_id)
REFERENCES employees(employee_id);
删除约束
ALTER TABLE table
DROP PRIMARY KEY | UNIQUE (column) |
CONSTRAINT constraint [CASCADE];
可以从USER_CONSTRAINTS或者USER_CONS_COLUMNS查到相关的约束信息,然后删除掉。CASCADE选项用来把依赖性的约束也一起删掉。
可以临时禁用约束
ALTER TABLE table
DISABLE CONSTRAINT constraint [CASCADE];
可以在CREATE TABLE或者ALTER TABLE语句中使用DISABLE子句
CASCADE选项会同时禁用依赖的约束
禁用唯一性约束或者主键约束会导致删除唯一性索引
启用约束
ALTER TABLE table
ENABLE CONSTRAINT constraint;
启用主键约束时,前面使用CASCADE禁用的依赖约束不会自动生效
CASCADE CONSTRAINTS子句伴随DROP COLUMN子句一起使用,用来删除所有和被删除的列相关的参考完整性约束,同时也会删除和该列相关的多列约束。
查询USER_CONSTRAINTS表来得到所有的约束定义和名字。
SELECT constraint_name, constraint_type,
search_condition
FROM user_constraints
WHERE table_name = 'EMPLOYEES';
约束的类型:C-CHECK, P-PRIMARY KEY, R-Referential Integrity(外键), U-UNIQUE。注意NOT NULL也属于CHECK约束
查看和列相关的约束,使用USER_CONS_COLUMNS视图
SELECT constraint_name, column_name
FROM user_cons_columns
WHERE table_name = 'EMPLOYEES';
练习(答案参见卷2的311页)
1. alter table emp