关于 oracle 外键引用 与 goldengate

一、准备知识
约束放置在表中,有以下五种约束:
 NOT NULL          非空约束C     指定的列不允许为空值
 UNIQUE             唯一约束U     指定的列中没有重复值,或该表中每一个值或者每一组值都将是唯一的
 PRIMARY KEY       主键约束P     唯一的标识出表的每一行,且不允许空值值,一个表只能有一个主键约束
 FOREIGN KEY       外键约束R     一个表中的列引用了其它表中的列,使得存在依赖关系,可以指向引用自身的列
 CHECK              条件约束C     指定该列是否满足某个条件
约束命名规则
 如果不指定约束名Oracle server 自动按照SYS_Cn 的格式指定约束名,也可手动指定,
 推荐的约束命名是:约束类型_表名_列名。
 NN:NOT NULL          非空约束,比如nn_emp_sal
 UK:UNIQUE KEY         唯一约束
 PK:PRIMARY KEY       主键约束
 FK:FOREIGN KEY       外键约束
 CK:CHECK             条件约束
外键约束是用来维护从表和主表的引用完整性的,所以外键约束要涉及两个表。
 FOREIGN KEY: 在表级指定子表中的列
 REFERENCES: 标示在父表中的列
 ON DELETE CASCADE: 当父表中的列被删除时,子表中相对应的列也被删除
 ON DELETE SET NULL: 子表中相应的列置空
 
二、外键创建测试
foreign_main为主表
foreign_sub为从表
object_id做为foreign_sub的外键,参考主表foreign_main的object_id值
 
SQL> create table foreign_main as select object_id from all_objects;
Table created.
SQL> select count(*) from foreign_main;
  COUNT(*)
----------
     49571
SQL> create table foreign_sub as select object_id,object_name from all_objects;
Table created.
 
建议使用主表的主键做外键,即使不是主表的主键也应该是唯一约束的字段做为外键
 
SQL> alter table foreign_main add constraint pk_fsid primary key(object_id);
Table altered.
 
SQL> delete from foreign_sub where object_name = 'FOREIGN_MAIN';
1 row deleted.
 
SQL> commit;
Commit complete.
 
SQL>  alter table foreign_sub add constraint fr_fssid foreign key(object_id) references foreign_main(object_id);
Table altered.
 
从表插入一条主表object_id中不存在的记录测试
SQL> insert into foreign_sub values(1,'ts');
insert into foreign_sub values(1,'ts')
*
ERROR at line 1:
ORA-02291: integrity constraint (TEST.FR_FSSID) violated - parent key not found
提示主表数据不存在,从表不能创建主表不存在的object_id以保证完整性
 
三、级联删除测试
 
SQL>  alter table foreign_sub drop constraint fk_fs_oid;
Table altered.
SQL>  alter table foreign_sub add constraint fk_fs_oid foreign key(object_id) references foreign_main(object_id) on delete cascade;
Table altered.
 
cascade下仍然不能单独更新主表外键字段
 
SQL> update foreign_main set object_id=52012 where object_id=52010;
update foreign_main set object_id=52012 where object_id=52010
*
ERROR at line 1:
ORA-02292: integrity constraint (TEST.FK_FS_OID) violated - child record found
 
cascade模式下可以通过主表删除外键字段数据关联删除从表数据
 
SQL> select * from foreign_sub where object_id=52010;
 OBJECT_ID OBJECT_NAME
---------- ------------------------------
     52010 IDX_BJNAME
 
SQL> delete from foreign_main where object_id=52010;
1 row deleted.
 
SQL> commit;
Commit complete.
 
SQL> select * from foreign_sub where object_id=52010;
no rows selected
 
外键相关常用操作及参考文档
 
建立外键
alter table 表名 add constraint 外键名 foreign key(从表外键字段) references foreign_main(主表外键字段);
drop表外键
alter table 表名 drop constraint 外键名;
通过外键找表
select * from user_constraints where constraint_type='R' and constraint_name=upper('外键名');
通过表找外键
select * from user_constraints where constraint_type='R' and table_name=upper('表名');
查找表的外键(包括名称,引用表的表名和对应的键名,下面是分成多步查询):
select * from user_constraints c where c.constraint_type = 'R' and c.table_name = 要查询的表
查询引用表的键的列名:
select * from user_cons_columns cl where cl.constraint_name = 外键引用表的键名
 
外键约束临时disabled
alter table 表名 disable constraint 外键名;
 
在SQL92标准中定义了几种外键改变后,如何处理子表记录的动作,其中包括:
 
限制Restrict:这种方式不允许对被参考的记录的键值执行更新或删除的操作;置为空Set to null:当参考的数据被更新或者删除,那么所有参考它的外键值被置为空;
置为默认值Set to default:当参考的数据被更新或者删除,那么所有参考它的外键值被置为一个默认值;
级联Cascade:当参考的数据被更新,则参考它的值同样被更新,当参考的数据被删除,则参考它的子表记录也被删除;
不做操作No action:这种方式不允许更新或删除被参考的数据。和限制方式的区别在于,这种方式的检查发生在语句执行之后。Oracle默认才会的方式就是这种方式。
 
Col OWNER FOR A6
COL R_OWNER FOR A6
COL TABLE_NAME FOR A15
select OWNER, TABLE_NAME, CONSTRAINT_NAME, CONSTRAINT_TYPE, R_OWNER, R_CONSTRAINT_NAME, DELETE_RULE from user_constraints where table_name in ('FOREIGN_MAIN', 'FOREIGN_SUB');
 
Select CONSTRAINT_NAME from user_constraints e where e.table_name='IMS_COLUMN' and owner='WSJD_ELMS6';
Select b.table_name,b.column_name, A.CONSTRAINT_TYPE, C.TABLE_NAME from user_constraints a, user_cons_columns b, user_constraints C
WHERE a.constraint_name = b.constraint_name AND
A.R_CONSTRAINT_NAME = C.CONSTRAINT_NAME
AND a.r_constraint_name IN (Select CONSTRAINT_NAME from user_constraints e where e.table_name='FOREIGN_MAIN' and owner='SCOTT');
create table foreign_sub as select  object_id, object_name from user_objects;
 
create table foreign_main as select object_id from foreign_sub;
 
alter table foreign_main add constraint pk_foreign_main_object_id primary key(object_id);
 
alter table foreign_sub add constraint fr_foreign_sub_object_id foreign key(object_id) references foreign_main(object_id) on delete cascade;
 
alter table foreign_sub drop constraint fr_foreign_sub_object_id;
 
alter table foreign_sub disable constraint fr_foreign_sub_object_id;
 
如在goldengate 没有禁用外键约束会出现以现错误
=============================================
2013-12-26 04:51:25  INFO    OGG-00996  Oracle GoldenGate Delivery for Oracle, rep_app.prm:  REPLICAT REP_APP started.
2013-12-26 04:51:25  WARNING OGG-00869  Oracle GoldenGate Delivery for Oracle, rep_app.prm:  OCI Error ORA-02292: integrity constraint (SCOTT.FR_FOREIGN_SUB_OBJECT_ID) violated - child record found (status = 2292). DELETE FROM "SCOTT"."FOREIGN_MAIN"  WHERE "OBJECT_ID" = :b0.
2013-12-26 04:51:25  WARNING OGG-01004  Oracle GoldenGate Delivery for Oracle, rep_app.prm:  Aborted grouped transaction on 'SCOTT.FOREIGN_MAIN', Database error 2292 (OCI Error ORA-02292: integrity constraint (SCOTT.FR_FOREIGN_SUB_OBJECT_ID) violated - child record found (status = 2292). DELETE FROM "SCOTT"."FOREIGN_MAIN"  WHERE "OBJECT_ID" = :b0).
2013-12-26 04:51:25  WARNING OGG-01003  Oracle GoldenGate Delivery for Oracle, rep_app.prm:  Repositioning to rba 17426 in seqno 29.
2013-12-26 04:51:25  WARNING OGG-01154  Oracle GoldenGate Delivery for Oracle, rep_app.prm:  SQL error 2292 mapping SCOTT.FOREIGN_MAIN to SCOTT.FOREIGN_MAIN OCI Error ORA-02292: integrity constraint (SCOTT.FR_FOREIGN_SUB_OBJECT_ID) violated - child record found (status = 2292). DELETE FROM "SCOTT"."FOREIGN_MAIN"  WHERE "OBJECT_ID" = :b0.
2013-12-26 04:51:25  WARNING OGG-01003  Oracle GoldenGate Delivery for Oracle, rep_app.prm:  Repositioning to rba 17426 in seqno 29.
2013-12-26 04:51:25  ERROR   OGG-01296  Oracle GoldenGate Delivery for Oracle, rep_app.prm:  Error mapping from SCOTT.FOREIGN_MAIN to SCOTT.FOREIGN_MAIN.
2013-12-26 04:51:25  WARNING OGG-01525  Oracle GoldenGate Delivery for Oracle, rep_app.prm:  Failed to open trace output file, 'gglog-REP_APP.dmp', error 13 (Permission denied).
2013-12-26 04:51:25  ERROR   OGG-01668  Oracle GoldenGate Delivery for Oracle, rep_app.prm:  PROCESS ABENDING.
 
2013-12-26 04:52:20  INFO    OGG-00996  Oracle GoldenGate Delivery for Oracle, rep_app.prm:  REPLICAT REP_APP started.
2013-12-26 04:52:20  WARNING OGG-00869  Oracle GoldenGate Delivery for Oracle, rep_app.prm:  No unique key is defined for table 'FOREIGN_SUB'. All viable columns will be used to represent the key, but may not guarantee uniqueness.  KEYCOLS may be used to define the key.
2013-12-26 04:52:20  WARNING OGG-01004  Oracle GoldenGate Delivery for Oracle, rep_app.prm:  Aborted grouped transaction on 'SCOTT.FOREIGN_SUB', Database error 1403 (OCI Error ORA-01403: no data found, SQL <DELETE FROM "SCOTT"."FOREIGN_SUB"  WHERE "OBJECT_ID" = :b0 AND "OBJECT_NAME" = :b1 AND ROWNUM = 1>).
2013-12-26 04:52:20  WARNING OGG-01003  Oracle GoldenGate Delivery for Oracle, rep_app.prm:  Repositioning to rba 17426 in seqno 29.
2013-12-26 04:52:20  WARNING OGG-01154  Oracle GoldenGate Delivery for Oracle, rep_app.prm:  SQL error 1403 mapping SCOTT.FOREIGN_SUB to SCOTT.FOREIGN_SUB OCI Error ORA-01403: no data found, SQL <DELETE FROM "SCOTT"."FOREIGN_SUB"  WHERE "OBJECT_ID" = :b0 AND "OBJECT_NAME" = :b1 AND ROWNUM = 1>.
2013-12-26 04:52:20  WARNING OGG-01003  Oracle GoldenGate Delivery for Oracle, rep_app.prm:  Repositioning to rba 17426 in seqno 29.
2013-12-26 04:52:20  ERROR   OGG-01296  Oracle GoldenGate Delivery for Oracle, rep_app.prm:  Error mapping from SCOTT.FOREIGN_SUB to SCOTT.FOREIGN_SUB.
2013-12-26 04:52:20  WARNING OGG-01525  Oracle GoldenGate Delivery for Oracle, rep_app.prm:  Failed to open trace output file, 'gglog-REP_APP.dmp', error 13 (Permission denied).
2013-12-26 04:52:20  ERROR   OGG-01668  Oracle GoldenGate Delivery for Oracle, rep_app.prm:  PROCESS ABENDING.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Oracle 中的外键约束用于维护表之间的引用完整性,它定义了一个表中的一列或多列与另一个表中的一列或多列之间的关系。这个关系可以是单向的,也可以是双向的。 在 Oracle 中,创建外键约束需要满足以下条件: 1. 外键列和所引用的主键列的数据类型必须相同。 2. 外键列和所引用的主键列的长度必须相同。 3. 外键列和所引用的主键列必须都已经定义为 NOT NULL。 4. 外键列必须是索引列。 创建外键约束的语法如下: ``` ALTER TABLE 表名称 ADD CONSTRAINT 约束名称 FOREIGN KEY (外键列名称) REFERENCES 主键表名称 (主键列名称); ``` 其中,表名称是指需要添加外键约束的表名,约束名称是自定义的外键约束名称,外键列名称是需要添加外键约束的列名,主键表名称是被引用的表名,主键列名称是被引用表的主键列名。 例如,创建一个名为 "orders" 的表,它有一个外键列 "customer_id",引用了 "customers" 表的 "id" 列: ``` ALTER TABLE orders ADD CONSTRAINT orders_fk1 FOREIGN KEY (customer_id) REFERENCES customers (id); ``` ### 回答2: Oracle 外键约束是一种用于确保数据完整性的约束。它通过在列级别上定义关联关系,限制了一个表中的外键与另一个表中的主键或唯一键之间的关联关系。 外键约束可以用来保证数据的一致性和完整性。当我们在一个表中创建外键约束时,它会将指定列与另一个表的主键或唯一键进行关联。这样,在插入、更新或删除数据时,系统会自动检查外键约束,确保数据操作不会破坏关联关系。 外键约束可以有以下几个特点: 1. 外键关系必须在参照表上存在主键或唯一键约束。 2. 外键列的数据类型必须与参照列的数据类型匹配。 3. 外键列的值必须是参照表的主键或唯一键列中存在的值。 4. 当参照表的主键或唯一键更新或删除时,涉及到外键的操作也会受到影响。 外键约束的作用有以下几点: 1. 数据完整性:外键约束可以保证在关联表之间维护数据的一致性,防止无效或不合法数据的插入或更新。 2. 级联操作:定义级联操作可以在参照表上进行更新或删除操作时同时更新或删除关联的外键表中的数据,避免了手动处理关联数据的复杂性。 3. 查询优化:外键约束可以帮助优化查询,提高数据检索性能。 4. 数据模型的清晰性:通过外键约束,可以更清晰地定义表之间的关联关系,方便他人理解数据模型。 总之,Oracle 外键约束是一种强制性的关联关系,可以保证数据的一致性和完整性,提高数据库查询性能,并且使数据模型更加清晰易懂。 ### 回答3: Oracle外键约束是一种用来保持数据完整性的约束。它定义了两个表之间的关系,并防止数据库中的无效数据。外键约束在两个表之间创建引用,一个表中的一个列是另一个表的主键或唯一键。 通过外键约束,我们可以确保在从表中的外键列只包含在主表中已经存在的值。当我们向从表中插入或更新数据时,如果外键约束被违反,Oracle将抛出一个错误,阻止操作继续进行。 外键约束可以执行以下操作: 1. 防止删除或更新主表中的行,如果在从表中的外键列中仍然存在引用。这可以防止出现孤儿记录。 2. 防止插入或更新从表中的行,如果在主表中没有对应的主键或唯一键值。这可以防止出现无效的引用。 通过使用外键约束,我们可以确保数据库中的数据完整性和一致性。它可以减少数据错误和无效引用的可能性,并确保数据库中的相关数据保持一致。 外键约束可以在创建表时定义,也可以在后期通过ALTER TABLE语句添加。我们可以选择指定外键约束的名称,以及在违反约束时的动作,如RESTRICT、CASCADE或SET NULL。 总而言之,Oracle外键约束可以确保在表之间保持有效关系,防止无效引用和孤儿记录,并维护数据库的数据完整性和一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值