oracle外键约束学习
发布日期:2021-08-19 11:09:49 浏览次数:2 分类:技术文章

本文共 3501 字,大约阅读时间需要 11 分钟。

一、准备知识

约束放置在表中,有以下五种约束:
       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(*)----------     49571SQL> 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_BJNAMESQL> 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默认才会的方式就是这种方式。
http://www.cnblogs.com/lanshh/articles/724458.html
http://dbajun.iteye.com/blog/1822992
http://space.itpub.net/10710960/viewspace-610982
http://www.cnblogs.com/tracy/archive/2011/06/09/2076527.html
by cycsa

转载于:https://www.cnblogs.com/cycsa/archive/2013/05/16/3082074.html

转载地址:https://blog.csdn.net/weixin_30924087/article/details/96947550 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:B1826 [JSOI2010]缓存交换 贪心+离散化+堆
下一篇:性能测试五:jmeter进阶之后置处理器(正则、json提取器)

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年03月02日 17时31分10秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

java控制热敏打印机的例子.rar_stm32控制热敏打印机 2019-04-21
java clone equals_(原)java中对象复制、==、equals 2019-04-21
java滚动字幕实训报告_Java实习报告 (7000字).doc 2019-04-21
php7 memcached.exe,PHP7 下安装 memcache 和 memcached 扩展 2019-04-21
计算机二级java技巧,计算机二级报java难考吗 2019-04-21
php foreach 数据库,php – 使用foreach将数据库检索的数据排列在HTML表中 2019-04-21
拉格朗日matlab编程例题,Matlab习题讲解.doc 2019-04-21
case是不是php语言关键字,PHP语言 switch 的一个注意点 2019-04-21
linux php mkdir失败,linux – mkdir错误:参数无效 2019-04-21
config.php渗透,phpMyAdmin 渗透利用总结 2019-04-21
java list 合并 重复的数据_Java ArrayList合并并删除重复数据3种方法 2019-04-21
android volley 上传图片 和参数,android - 使用android中的volley将图像上传到multipart中的服务器 - 堆栈内存溢出... 2019-04-21
android开发的取消清空按钮,Android开发实现带清空按钮的EditText示例 2019-04-21
android gp服务,ArcGIS Runtime SDK for Android开发之调用GP服务(异步调用) 2019-04-21
mysql整体会滚_滚mysql 2019-04-21
向mysql数据库中添加批量数据类型_使用JDBC在MySQL数据库中快速批量插入数据 2019-04-21
最全的mysql 5.7.13_最全的mysql 5.7.13 安装配置方法图文教程(linux) 强烈推荐! 2019-04-21
mssql连接mysql数据库文件_在本地 怎么远程连接MSSQL数据库 2019-04-21
mssql 远程无法连接mysql_解决SQLServer远程连接失败的问题 2019-04-21
linux mysql c++编程_Linux下进行MYSQL的C++编程起步手记 2019-04-21