一. 外键说明
1.1 官网上有关说明如下:
Maintaining Data Integrity in Application Development
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_constraints.htm#sthref748
Managing FOREIGN KEY Integrity Constraints
General information about defining, enabling, disabling, and dropping all types of integrity constraints is given in section "Dropping Integrity Constraints". The present section supplements this information, focusing specifically on issues regarding FOREIGN KEY integrity constraints, which enforce relationships between columns in different tables.
Note:
FOREIGN KEY integrity constraints cannot be enabled if the constraint of the referenced primary or unique key is not present or not enabled.
-- 当外键参考的主键不可用时,对应的外键也不可用。
Datatypes and Names for Foreign Key Columns
You must use the same datatype for corresponding columns in the dependent and referenced tables. The column names do not need to match.
-- 外键及其参考的字段名称可以不一样,但datatype 必须一致。
Limit on Columns in Composite Foreign Keys
Because foreign keys reference primary and unique keys of the parent table, and PRIMARY KEY and UNIQUE key constraints are enforced using indexes, composite foreign keys are limited to 32 columns.
Foreign Key References Primary Key by Default
If the column list is not included in the REFERENCES option when defining a FOREIGN KEY constraint (single column or composite), then Oracle Database assumes that you intend to reference the primary key of the specified table.
-- 当创建外键时,没有指定参考的字段,默认使用primary key
Alternatively, you can explicitly specify the column(s) to reference in the parent table within parentheses. Oracle Database automatically checks to verify that this column list references a primary or unique key of the parent table. If it does not, then an informative error is returned.
-- 外键必须是primary key 或者是unique key。
Privileges Required to Create FOREIGN KEY Integrity Constraints
To create a FOREIGN KEY constraint, the creator of the constraint must have privileged access to the parent and child tables.
(1)The Parent Table The creator of the referential integrity constraint must own the parent table or have REFERENCES object privileges on the columns that constitute the parent key of the parent table.
(2)The Child Table The creator of the referential integrity constraint must have the ability to create tables (that is, the CREATE TABLE or CREATE ANY TABLE system privilege) or the ability to alter the child table (that is, the ALTER object privilege for the child table or the ALTER ANY TABLE system privilege).
In both cases, necessary privileges cannot be obtained through a role; they must be explicitly granted to the creator of the constraint.
These restrictions allow:
(1)The owner of the child table to explicitly decide which constraints are enforced and which other users can create constraints
(2)The owner of the parent table to explicitly decide if foreign keys can depend on the primary and unique keys in her tables。
Choosing How Foreign Keys Enforce Referential Integrity
Oracle Database allows different types of referential integrity actions to be enforced, as specified with the definition of a FOREIGN KEY constraint:
(1)Prevent Delete or Update of Parent Key
The default setting prevents the deletion or update of a parent key if there is a row in the child table that references the key. For example:
SQL>create table emp_tab ( foreign key (deptno) references dept_tab);
(2)Delete Child Rows When Parent Key Deleted
The ON DELETE CASCADE action allows parent key data that is referenced from the child table to be deleted, but not updated. When data in the parent key is deleted, all rows in the child table that depend on the deleted parent key values are also deleted. To specify this referential action, include the ON DELETE CASCADE option in the definition of the FOREIGN KEY constraint. For example:
SQL>CREATE TABLE Emp_tab (
FOREIGN KEY (Deptno) REFERENCES Dept_tab
ON DELETE CASCADE);
(3)Set Foreign Keys to Null When Parent Key Deleted
The ON DELETE SET NULL action allows data that references the parent key to be deleted, but not updated. When referenced data in the parent key is deleted, all rows in the child table that depend on those parent key values have their foreign keys set to null. To specify this referential action, include the ON DELETE SET NULL option in the definition of the FOREIGN KEY constraint. For example:
SQL>CREATE TABLE Emp_tab (
FOREIGN KEY (Deptno) REFERENCES Dept_tab
ON DELETE SET NULL);
Viewing Definitions of Integrity Constraints
The data dictionary contains the following views that relate to integrity constraints:
ALL_CONSTRAINTS
ALL_CONS_COLUMNS
USER_CONSTRAINTS
USER_CONS_COLUMNS
DBA_CONSTRAINTS
DBA_CONS_COLUMNS
For example:
SQL>SELECT Constraint_name, Constraint_type, Table_name, R_constraint_name
FROM User_constraints;
1.2 外键索引
如果在对应的child table 上,没有建立外键索引,那么可能造成enq: TM contention 的等待事件。 关于该等待事件具体参考我的Blog:
Oracle enq: TX contention 和 enq: TM contention 等待事件说明
http://blog.csdn.net/tianlesoftware/archive/2011/06/04/6526238.aspx
Tom 同学提供的一个查询没有见外键索引的表的SQL:
/* Formatted on 2011/6/4 15:39:24 (QP5 v5.163.1008.3004) */
SELECT table_name,
constraint_name,
cname1
|| NVL2 (cname2, ',' || cname2, NULL)
|| NVL2 (cname3, ',' || cname3, NULL)
|| NVL2 (cname4, ',' || cname4, NULL)
|| NVL2 (cname5, ',' || cname5, NULL)
|| NVL2 (cname6, ',' || cname6, NULL)
|| NVL2 (cname7, ',' || cname7, NULL)
|| NVL2 (cname8, ',' || cname8, NULL)
columns
FROM ( SELECT b.table_name,
b.constraint_name,
MAX (DECODE (position, 1, column_name, NULL)) cname1,
MAX (DECODE (position, 2, column_name, NULL)) cname2,
MAX (DECODE (position, 3, column_name, NULL)) cname3,
MAX (DECODE (position, 4, column_name, NULL)) cname4,
MAX (DECODE (position, 5, column_name, NULL)) cname5,
MAX (DECODE (position, 6, column_name, NULL)) cname6,
MAX (DECODE (position, 7, column_name, NULL)) cname7,
MAX (DECODE (position, 8, column_name, NULL)) cname8,
COUNT (*) col_cnt
FROM (SELECT SUBSTR (table_name, 1, 30) table_name,
SUBSTR (constraint_name, 1, 30) constraint_name,
SUBSTR (column_name, 1, 30) column_name,
position
FROM user_cons_columns) a,
user_constraints b
WHERE a.constraint_name = b.constraint_name
AND b.constraint_type = 'R'
GROUP BY b.table_name, b.constraint_name) cons
WHERE col_cnt >
ALL ( SELECT COUNT (*)
FROM user_ind_columns i
WHERE i.table_name = cons.table_name
AND i.column_name IN
(cname1,
cname2,
cname3,
cname4,
cname5,
cname6,
cname7,
cname8)
AND i.column_position <= cons.col_cnt
GROUP BY i.index_name)
/
可以通过该SQL 查看没有建外键索引的表。
1.3 外键的一些示例
-- 创建parent table
SQL> create table parent_tab as select distinct object_type from dba_objects;
Table created.
-- 创建child table
SQL> create table child_tab
2 as
3 select object_id, object_type, object_name
4 from all_objects;
Table created.
-- parent table添加primary key
SQL> alter table parent_tab add constraint pk_parent_tab primary key (object_type);
Table altered.
-- child table 创建 primary key
SQL> alter table child_tab add constraint pk_child_tab primary key (object_id);
Table altered.
--child table 创建 on delete cascde 外键
SQL> alter table child_tab add constraint fk_child_parent_tab foreign key (object_type) references parent_tab on delete cascade;
Table altered.
--查看约束信息
SQL> select constraint_name, constraint_type, table_name, r_constraint_name from user_constraints where table_name in ('PARENT_TAB','CHILD_TAB');
constraint_name constraint_type table_name r_constraint_name
------------------------- --------------- -------------------- -----------------
SYS_C0019826 C CHILD_TAB
SYS_C0019827 C CHILD_TAB
PK_CHILD_TAB P CHILD_TAB
FK_CHILD_PARENT_TAB R CHILD_TAB PK_PARENT_TAB
PK_PARENT_TAB P PARENT_TAB
其中约束类型对应如下:
C - Check constraint on a table
P - Primary key
U - Unique key
R - Referential integrity
V - With check option, on a view
O - With read only, on a view
H - Hash expression
F - Constraint that involves a REF column
S - Supplemental logging
其中有2个为C 的约束,这个不是我们建的,我们看以下他们的内容:
SQL> select table_name,constraint_name,search_condition, generated from user_constraints where table_name in ('parent_tab','child_tab');
table_name constraint_name search_condition generated
-------------------- ------------------------- ------------------------- --------------------
child_tab sys_c0019826 "object_id" is not null generated name
child_tab sys_c0019827 "object_name" is not null generated name
child_tab pk_child_tab user name
child_tab fk_child_parent_tab user name
parent_tab pk_parent_tab user name
这2个是系统自动生成的。
--测试: 从parent table 删除数据,看child table是否cascade 删除了
SQL> select count(*) from parent_tab;
COUNT(*)
----------
40
SQL> select count(*) from child_tab;
COUNT(*)
----------
43573
--从parent table 删除后,child table的数据也删除了
SQL> delete from parent_tab;
40 rows deleted.
SQL> select count(*) from child_tab;
COUNT(*)
----------
0
SQL> commit;
Commit complete.
-- 删除table
--直接drop parent table,报错ora-02449错误
SQL> drop table parent_tab;
drop table parent_tab
*
ERROR at line 1:
ORA-02449: unique/primary keys in table referenced by foreign keys
-- 先drop child table 后,在drop parent table,正常
SQL> drop table child_tab;
Table dropped.
SQL> drop table parent_tab;
Table dropped.
二. 有关外键的一些讨论
外键在维护数据的一致性和完整性有它的作用。 itpub 上有一个帖子,是讨论需不需要使用外键。
帖子链接如下:
http://www.itpub.net/thread-1313696-1-1.html
我的观点:事事没有绝对,存在既有它的价值,适当的使用还是有必要的。
-------------------------------------------------------------------------------------------------------
Blog: http://blog.csdn.net/tianlesoftware
Email: dvd.dba@gmail.com
DBA1 群:62697716(满); DBA2 群:62697977(满) DBA3 群:62697850(满)
DBA 超级群:63306533(满); DBA4 群: 83829929 DBA5群: 142216823
DBA6 群:158654907 聊天 群:40132017 聊天2群:69087192
--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请
分享到:
相关推荐
根据提供的标题、描述以及部分代码内容,我们可以了解到这篇文章主要探讨的是如何在Oracle数据库中查询所有用户表的相关信息,包括表名、主键名称、索引、外键等元数据信息。接下来,我们将对这些知识点进行详细的...
标题所提及的“生成SQLServer、Oracle数据库字段说明帮助工具”正是为了解决这类问题而设计的。这种工具的主要功能是提取数据库中的字段注释或描述,然后整理成易于理解和使用的帮助文档,以提高开发人员和DBA的工作...
- 验证字段类型、主键、外键等属性是否符合预期。 #### 三、数据导入操作 1. **使用Navicat导入数据**: - 打开“数据传输”功能,设置源数据库为Oracle,目标数据库为MySQL。 - 注意:在配置选项时避免使用...
Excel的便利性和灵活性使得用户可以方便地编辑和调整表结构,如添加、删除或修改列,设置主键、外键和索引等。工具会读取这些信息并自动生成相应的SQL脚本。 在使用这个工具时,用户首先需要在Excel中创建一个模板...
本说明将详细阐述这个过程中的关键步骤、工具选择以及注意事项。 首先,我们需要了解两个数据库系统的基本特性。MySQL是一种开源、轻量级的SQL数据库,广泛应用于中小型企业;而Oracle则是全球领先的商业数据库解决...
这一步涉及复制Oracle数据库中的表结构,包括表名、字段、数据类型、主键、外键、唯一性约束、非空约束等,并在DM8中重建。同时,迁移索引以保持查询性能,以及字段的注释和序列,用于自增字段。 四、删除键,约束...
以下是一些关于Oracle到MySQL转换工具及其涉及的技术知识点的详细说明: 1. **Oracle数据库**:Oracle是全球领先的关系型数据库管理系统,由甲骨文公司开发,以其高性能、高可用性和安全性著称。它支持复杂的SQL...
数据库设计文档和说明书对于任何涉及Oracle数据库项目的团队来说都是宝贵的资源。它不仅帮助开发人员理解数据结构,而且在系统维护、升级和故障排查时起到关键作用。因此,编写详尽、清晰的数据库设计文档是确保项目...
以下是对这个样例系统的一些关键知识点的详细说明: 1. **Oracle数据库基础**:Oracle是世界上最流行的关系型数据库管理系统之一,它提供了强大的数据存储、管理和查询能力。在人事管理系统中,Oracle作为后端数据...
2. **不支持主外键约束**:临时表不支持主键和外键约束,这可能会影响数据完整性的维护。 #### 六、示例 下面通过具体的SQL语句展示会话级临时表和事务级临时表的使用。 ##### 6.1 会话级临时表示例 ```sql ...
在"概述.txt"文件中,可能包含了工具的使用说明、安装步骤、依赖项以及如何配置数据库连接等信息。这通常是开发者为了便于其他用户理解和使用工具而提供的文档。用户应按照文档中的指示设置环境,包括安装Python 2.7...
Oracle支持多种类型的约束,如主键(PRIMARY KEY)、外键(FOREIGN KEY)、唯一性(UNIQUE)、非空(NOT NULL)和检查(CHECK)等。 **添加约束**: ```sql ALTER TABLE 表名 ADD CONSTRAINT 约束名 约束类型 ...
以下是对"Oracle数据库经典教程"的部分内容的详细说明: **走进Oracle** Oracle数据库系统由Oracle公司开发,提供了数据存储、管理、备份和恢复等一系列功能。它的强大性能、高度可扩展性和安全性使得它成为许多...
【描述】中的“简易的bbs论坛项目”说明这是一个基于Web的讨论平台,用户可以发布帖子、回复、浏览和搜索信息。这种系统通常包含用户管理、话题分类、帖子创建和交互等功能。数据库部分是其核心组件,负责存储用户...
在本案例中,我们将讨论如何在Oracle ADF中创建一个三级树形视图,以及如何通过图片和说明来辅助理解这一过程。 首先,我们需要在数据库层面建立层级关系。这里提到的"三级树"意味着我们会有三个相关联的表,每个表...
- 表结构包括字段名、数据类型、主键、外键等,迁移时需确保在MySQL中重建相同的结构。 - Oracle的触发器、存储过程、视图等可能需要转换为MySQL的等效物。 7. **数据导出与导入**: - Oracle可以通过`expdp`或`...
” 或 Ctrl+鼠标点击字串“[user.]objectName[@dbLink]”,如果是一表名,则能清楚地显示表的列信息(包括列名称、数据类型及长度、默认值、非空)、索引、约束条件(主键、唯一键、检查键、子表、触发器、外键、...
- 表的创建:实验要求建立至少三个数据表,需要理解SQL中的`CREATE TABLE`语法,以及如何设置主键和外键约束,确保数据完整性。 2. **JDBC(Java Database Connectivity)开发**: - 数据库连接:使用JDBC连接...
在这个Excel文件中,你可以看到每个表的名称、字段名、数据类型、长度、是否为主键、外键信息以及其他元数据。这使得用户可以方便地查看和编辑这些信息,或者将它们导入到其他数据处理工具中。 总结来说,"Oracle...