Oracle 外键约束
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle 外键约束
外键FOREIGN KEY约束是几种约束是最复杂的,外键约束可以使两个表进行关联。
外键是指引用另一个表中的某个列或某几个列,或者本表中另一个列或另几个列的列。
被引用的列应该具有主键约束,或者惟一性约束。
在外键的定义中,涉及到外键表、外键列、被引用表和被引用列等几个概念。
如果成功地创建了外键约束,那么系统将要求外键列中的数据必须来自被引用列中的数据。
被引用列中不存在的数据不能存储于外键列中。
在一般情况下,当删除被引用表中的数据时,该数据也不能出现在外键列中。
如果外键列存储了将要在被引用表中删除的数据,那么对被引用表删除数据的操作将失败。
最典型的外键约束是HR模式中的EMPLOYEES和DEPARTMENT表,在该外键约束中,外键表EMPLOYEES中的外键列DEMPARTMENT_ID将引用被引用表DEPARTMENTS 中的DEMPARTMENT_ID列。
例如,在以下的示例中,将以HR身份连接到数据库,并创建一个新表ADMINISTRATION_EMP,并为其添加到DEPATRMENT表的外键约束:SQL> connect hr/hr
已连接。
SQL> create table administration_emp
2 as select * from hr.employees
3 where department_id=10;
表已创建。
SQL> alter table administration_emp
2 add constraint admin_dep_fk
3 foreign key(department_id)
4
references departments(department_id);
表已更改。
为验证创建的外键约束的有效性,可以向ADMINISTRATION_EMP表添加一条记录,并且它的DEPARTMENT_ID列值不存在DEPARTMENTS表中,那么插入操作将会因为违反外键约束而失败:
SQL> insert into administration_emp(
2 employee_id,last_name,email,hire_date,job_id,department_id)
3 values(120,'刘丽','li@',sysdate,'HR_REP',360);
insert into administration_emp(
*
第 1 行出现错误:
ORA-02291: 违反完整约束条件(HR.ADMIN_DEP_FK) - 未找到父项关键字
注意在一个表上创建外键约束时,被引用表必须已经存在,并且必须为该表的引用列定义惟一性约束或主键约束。
如果外键表的外键列与被引用表中的被引用列名相同,如上面的示例所示,则为外键表定义外键列时可以简化为如下的形式:
SQL> alter table administration_emp
2 add constraint admin_dep_fk
3 foreign key(department_id)
4 references departments;
在定义外键FOREIGN KEY约束时,还可以通过关键字ON指定引用行为的类型。
当尝试删除被引表中的一条记录时,通过引用行为可以确定如何处理外键表中的外键列。
引用类型包括3种:
●在定义外键约束时,如果使用了CASADE关键字,那么当被引用表中被引用列的
数据被删除时,外键表中对应的数据也将被删除。
●在定义外键约束时,如果使用了关键字SET NULL,那么当被引用表中被引用列的
数据被删除时,外键表中外键列将被设置为NULL。
要使这个关键字起作用,在外
键列必须支持NULL值。
●在定义外键约束时,如果使用了关键字NO ACTION,那么当删除被引用表中被引
用列的数据时将违反外键约束,该操作将被禁止执行,这也是外键的默认引用类型。
例如,下面的实例将演示外键的级联删除。
(1)以HR身份连接到数据库,创建一个新的引用表,并为其添加主键约束。
SQL> connect hr/hr
已连接。
SQL> create table admin_dept
2 as select * from hr.departments
3 where department_id=10;
表已创建。
SQL> alter table admin_dept
2 add primary key(department_id);
表已更改。
(2)使用ON DELETE CASADE关键字修改ADMINISTRATION_EMP表的外键约束。
SQL> alter table administration_emp
2 add constraint admin_dept_fk
3 foreign key(department_id)
4 references admin_dept on delete cascade;
表已更改。
(3)查看ADMINISTRATION_EMP表中的数据。
SQL> select employee_id,last_name,job_id,salary,department_id
2 from administration_emp;
EMPLOYEE_ID LAST_NAME JOB_ID SALARY DEPARTMENT_ID
----------------- --------------------- ---------- ---------- -------------
200 Whalen AD_ASST 4400 10 (4)在指定外键行为类型为ON DELETE CASADE后,在删除被引用表ADMIN_DEPT 中编号为10的行时,系统将会级联删除ADMINISTRA TION_EMP表中所有的记录。
SQL> delete admin_dept
2 where department_id=10;
已删除 1 行。
SQL> select employee_id,last_name,job_id,salary,department_id
2 from administration_emp;
未选定行
与其他约束相同,如果想要删除外键约束,可以使用如下的ALTER TABLE语句形式:alter table administration_emp
drop constraint admin_dept_fk;。