当前位置:  数据库>oracle

存在外键关联的主表truncate如何做

    来源: 互联网  发布时间:2017-06-17

    本文导语: 主外键是数据库提供的一种两表之间强制关联的方法,也可以从应用层实现。   优点 缺点 数据库实现的主外键 由数据库层机制保证,无需应用额外实现 强关联,不易扩展变更 应用实现的主外键 易扩展变更 完全由应用...

主外键是数据库提供的一种两表之间强制关联的方法,也可以从应用层实现。

  优点
缺点
数据库实现的主外键
由数据库层机制保证,无需应用额外实现
强关联,不易扩展变更
应用实现的主外键
易扩展变更

完全由应用控制,要求较高

我认为需要根据实际情况进行取舍,例如表不复杂,可以由应用实现,若表之间关联较多且复杂,那么交由数据库处理,至少保证不会错。

存在主外键关联的主表,由于存在外键关联关系,因此有些操作就会禁止,例如truncate。

实验

1. 创建测试表
SQL> create table tbl_a(id number, remark varchar2(1));
Table created.

SQL> create table tbl_b(id number, a_id number, remark varchar2(1));
Table created.

SQL> alter table tbl_a add constraint pk_tbl_a primary key(id);
Table altered.

SQL> alter table tbl_b add constraint pk_tbl_b primary key(id);
Table altered.

SQL> alter table tbl_b add constraint fk_tbl_b_a foreign key(a_id) references tbl_a(id);
Table altered.
 
tbl_a是主表,tbl_b是子表,关联tbl_a。

2. 现在主表和子表没有任何数据,此时执行truncate主表

SQL> truncate table tbl_a;
Table truncated.
可以执行。

3. 向主表插入一条记录,再次执行truncate
SQL> insert into tbl_a values(1, 'a');
1 row created.

SQL> commit;
Commit complete.

SQL> truncate table tbl_a;
truncate table tbl_a
*
ERROR at line 1:
ORA-02266: unique/primary keys in table referenced by enabled foreign keys
 
此时提示了ORA-02266:唯一/主键被启用的外键引用
 

看看ORA-02266的解释:

02266, 00000, "unique/primary keys in table referenced by enabled foreign keys"
// *Cause: An attempt was made to truncate a table with unique or
//        primary keys referenced by foreign keys enabled in another table.
//        Other operations not allowed are dropping/truncating a partition of a
//        partitioned table or an ALTER TABLE EXCHANGE PARTITION.
// *Action: Before performing the above operations the table, disable the
//          foreign key constraints in other tables. You can see what
//          constraints are referencing a table by issuing the following
//          command:
//          SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = "tabnam";

比较清楚地说明了问题,以及解决方法:可以在执行前,先禁用外键约束,执行truncate后再恢复外键约束。

4. 禁用外键约束,删除后执行恢复操作

看到外键约束名称:FK_TBL_B_A:
 SQL> select constraint_name, constraint_type, status from user_constraints where table_name='TBL_B';

CONSTRAINT_NAME                C STATUS
------------------------------ - --------
PK_TBL_B                      P ENABLED
FK_TBL_B_A                    R ENABLED

 


禁止外键约束:
SQL> alter table tbl_b disable constraint FK_TBL_B_A;

Table altered.

SQL> select constraint_name, constraint_type, status from user_constraints where table_name='TBL_B';

CONSTRAINT_NAME                C STATUS
------------------------------ - --------
PK_TBL_B                      P ENABLED
FK_TBL_B_A                    R DISABLED

STATUS状态变为DISABLED了。

truncate表:
SQL> truncate table tbl_a;

Table truncated.

恢复约束:
SQL> alter table tbl_b enable constraint FK_TBL_B_A;

Table altered.

SQL> select constraint_name, constraint_type, status from user_constraints where table_name='TBL_B';

CONSTRAINT_NAME                C STATUS
------------------------------ - --------
PK_TBL_B                      P ENABLED
FK_TBL_B_A                    R ENABLED

总结:
 
1. 主外键是数据库提供的强约束,可以帮助我们控制主子表之间的关系,但同时还是一把双刃剑,当然,我们认为既然定义了主外键,就是需要这种强制关系,但有时可能就会有一些变更,因此,如何取舍,需要根据实际情况来决策。

2. 主外键关联中的主表,如果有数据,则不能直接用truncate方式删除,因为会认为有外键和其关联,不能直接截断主表,若需要做,可以先禁止外键约束,主表变成一个独立的表,这样就可以执行truncate了。


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 调查发现微信存在漏洞:冒充微信助手骗密码
  • 恕我无知,存在session里和存在cookie里是不是存在了同一地方
  • Sophos UTM WebAdmin存在未明漏洞
  • 我怎么样才能知道库中某表已经存在或者不存在?
  • Uploadify 'uploadify.php'存在多个输入验证漏洞
  • unix下如何判断一个文件夹是否存在?(也就是某个路径是否存在)
  • PHP 'ext/soap/php_xml.c'不完整修复存在多个任意文件泄露漏洞
  • Oracle删除表前判断表名是否存在若存在则删除
  • cocos2d中CCSpriteFrameCache文件同时存在两个plist的问题解决
  • 请问soralis下怎么写脚本判断进程是否存在,不存在则启动?
  • liunx中如何用C实现检测某个进程时候存在,如不存在,启动该进程。。。。。。。。
  • ubuntu如何让内核监视我的程序进程是否存在,不存在就启动
  • 我装的是JDK1.3,在编译SERVLET程序时,提示SERVLET包不存在,试过JSDK1.4也存在同样的问题,我该怎么办?
  • 新手请问,检查某个指定文件是否存在于opt目录下,如果存在则把该文件名保存到文本文件里,用Shell脚本如何写?请简写代码供参,谢谢。PM5
  • mysql 存在该记录则更新,不存在则插入记录的sql
  • 利用linux命令cat, uniq, sort找出file1中存在,file2中不存在的文本行
  • 如果判断目录下一个文件已经存在与否?
  • 请问用什么方法能判断一个文件是否存在,谢谢!
  • mysql 记录不存在时插入 记录存在则更新的实现方法
  • jquery怎么判断html元素是否存在
  • java判断远程服务器上的文件是否存在的方法


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3