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

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

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

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

存在主外键关联的主表,由于存在外键关联关系,因此有些操作就会禁止,例如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了。



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

  1. PostgreSQL — 外键关联操作

    目录 文章目录 目录 PostgreSQL 的外键关联 创建表时定义外键(References,参照) 修改原有表的外键约束 删除外键约束 参考文档 PostgreSQL 的外键关联 一个外键约束指定 ...

  2. MySQL — 外键关联操作

    目录 文章目录 目录 MySQL 的外键约束 创建表时定义外键(References,参照) 修改原有表的外键约束 删除外键约束 参考文档 MySQL 的外键约束 注意,MySQL 的 InnoDB ...

  3. 【Python】django模型models的外键关联使用

    [Python]django模型models的外键关联使用 Python 2.7.10,django 1.8.6 外键关联:http://www.bubuko.com/infodetail-61830 ...

  4. Mysql中的外键分析(什么是外键,为什么要用外键,添加外键,主外键关联删除)

    有一个东西一直在我脑海中是个很烦的东西,但是这东西不搞清楚会阻碍自己的前进.自己做项目demo永远只能用一张表... 所以今天还是学习了下外键希望能够搞明白一些... 百度上搜索外键的作用" ...

  5. 主外键关联删除(on delete set null和on delete cascade)

    主外键关联,当删除的是父表数据,参照这些要删除的数据,Oracle有三种处理方式: 1.禁止删除,也是Oracle默认方法. 2.将参照要删除数据的子表对应数据置空. 3.将参照要删除数据的子表对应数 ...

  6. 转载:主外键关联删除(on delete set null和on delete cascade)

    本文对mysql也成立.把创建表的数据类型从oracle支持的换成mysql支持的就行了,即: number换成int, varchar2换成varchar. 创建外键后,表的结构为: CREATE ...

  7. mysql 删除表数据_主外键关联表的数据删除策略

    说个题外话,我从来没想过会被拼多多这款软件所魔怔,他的这种社交营销的能力,实在是太强了,在怂恿之下,开始给儿子拼个这个, 各位有空帮砍下,https://w.url.cn/s/AzlPAB9,或者扫下 ...

  8. hibernate---一对一单项外键关联

    常见的数据库设计有两种:主键关联,单项的外键关联. 下面是一对一单项外键关联: 代码: 后台生成的表: 配置powerdesigner连接数据库,可以查看数据表的关联: 一般在powerdesigne ...

  9. MySQL外键关联(一对多)MySQL连接查询

    MySQL外键关联(一对多) 外键说明 什么是外键? 1)表A中有字段(如身份证号)做了主键,表B中也有这个字段(身份证号),这里的身份证号一定来自表A同样字段里的内容,但再B表中身份证号对应id可以 ...

最新文章

  1. 关于v$process与v$session中process的理解
  2. Java远程发送表单信息,java – 从html表单读取POST数据发送到serversocket
  3. Linux C编程--线程操作3--线程属性解析
  4. webstorm git 怎么断开版本控制 webstorm git for windows 禁止 自动运行
  5. zemax操作数_ZEMAX与像差理论:二级光谱的ZEMAX描述与详解
  6. Android 6种快速开发框架
  7. 单片机IO口模拟串口程序(发送+接收
  8. Linux常用性能分析监控工具 iostat、iotop、top、htop、free、iftop
  9. 人脸方向学习(十一):Face Landmark Detection-PFLD解读
  10. 【Java程序设计】图形用户界面(一)
  11. OneNote插件Notehighlight个性化设置
  12. “坦克大战”小游戏(C语言)源代码及其详解注释
  13. 程序代码中,怎么区分status和state?
  14. word2vec查询中文词向量同义词
  15. 神经网络打印模型参数及参数名字和数量
  16. PDF压缩文件怎么压缩最小?用迅读PDF大师,一键无损压缩
  17. Android粒子篇之Bitmap像素级操作
  18. AWS实例3T磁盘初始化分区及docker环境部署
  19. C语言中的字符串与字符串函数
  20. 【程序人生】互联网岗位分工;互联网开发流程;职责分工

热门文章

  1. Linux中设置开机启动执行命令和普通用户配置环境变量开机启动生效
  2. 2022金三银四前端面试题预告
  3. Redis命令语法大全
  4. windows中不能创建的目录
  5. python发票二维码条码识别_Python实现二维码、条形码识别
  6. 5G射频室内测试的关键技术
  7. Flutter 圆形(头像)图片的 4种实现
  8. 一.微信小程序一些接口的使用
  9. oracle计算两行差值
  10. matlab的数值积分