Oracle-12-外键约束

一、外键约束(即引用完整性约束)

例:有如下两张表他们之间的引用完整性

create tablestudent (--学生表

s_id number(5)primary key,

s_namevarchar2(20),

t_idvarchar2(5),

constraint fk_stuforeign key (t_id) references team (t_id)

)

create tableteam (--班级表

t_idvarchar2(5) primary key,

t_namevarchar2(20)

)

其中constraintfk_stu foreign key (t_id) references team (t_id)中,第一个t_id指的是学生表中的t_id,第二个t_id指的是班级表中的t_id

例:

(1)图中学生表中每个学号为主键(【注意】以后建表必须要主键),每一个学号对应一个班级号,所以在学生表中,只要给定一个学号,就能查到其对应的班级号,那么再去班级表中可以查询到对应的班级名称。

(2)对于图中学生表第三行有个t005班级号是错误的,因为在班级表中不存在t005编号对应的班级,班级号称为学生表的外键,因此这时就必须有外键约束。

(3)外键约束:是一种子父关系,且可以很好的保护两表之间的关系。

(4)图中t005是非法数据,所以正确数据是要么学生表第三行班级号不写任何数据,要么就写t001或者t002。

二、建外键的语法

【注意】

1.建外键的命令必须放在含有外键的那张表中,即子表中。

2.子表和父表如何判断?子和父对应关系是n:1,就是一个人只能有一个爹,而一个爹可以有多个儿!

constraint
自定义的外键名foreign key (外键列名) references父表(列名)

3.外键允许为空

4.插入有数据的值,外键中的值必须能够在父表中找到(如上图学生表中的t005就是非法数据,因为t005在父表中找不到)

如:constraintfk_stu foreign key (t_id) references team (t_id)

 

实战操作:

规定一个运动员只能参加一个项目,一个项目可以被多个运动员参加,

所以项目和运动员关系是1:N。

Step1:先创建父表,记得规定主键,如下图:

Step2:再创建子表,注意图中的主键和外键约束语句,如下图:

Step3:往父表game中插入数据,如下图:

Step4:往子表player里面插入数据,注意外键约束,因为此时父表game里面只有1001、1002、1003三个项目,那么此时先“让刘翔参加1001”,如下图:

如果此时“让博尔特参加1004”,如下图:

报错,因为1004在父表game中查不到,违反外键约束。

所以说“未找到父项关键字”,这时候就是

外键约束在保护数据。

Step5:继续验证,在子表player中插入数据,外键为null,如下图:

因此外键可以插入空数据,即null。

Step6:说一个超前知识,即两表查询,这个后续会详细介绍,如下图:

时间: 2025-01-13 21:32:45

Oracle-12-外键约束的相关文章

oracle 删除外键约束 禁用约束 启用约束

oracle 删除外键约束 禁用约束 启用约束 执行以下sql生成的语句即可 删除所有外键约束 Sql代码 select 'alter table '||table_name||' drop constraint '||constraint_name||';' from user_constraints where constraint_type='R' 禁用所有外键约束 Sql代码 select 'alter table '||table_name||' disable constraint

Oracle存储过程update受外键约束的主键值时完整性冲突解决方案

1.问题背景 虽然在数据库操作中我们并不提倡修改主键,但是确实在实际生活中有这样的业务需求: 表A有主键KA,表B中声明了一个references A(KA)的外键约束,我们需要修改A中某条目KA的值并且更新B中外键约束. 但是DBMS在执行了第一条update后检查完整性会发现冲突:B中条目的外键不存在. 注:我在Oracle database环境下遇到这个问题的,Oracle很蛋疼的不能设置外键为update级连,所以只有人工处理. 2.举例说明 用一个简单的例子说明,数据库中有以下三个表:

Oracle的主键约束、唯一约束与外键约束

http://www.shangxueba.com/jingyan/122163.html主键:  1.主键约束: 一个表只能有一个主键约束.主键可以是单个字段,也可以是多个字段.无论是哪种情况,其所有字段都是NOT NULL.  2.Unique约束:一个表可以有多个Unique约束,Unique的字段可以为NULL.  3.主键与Unique:不同点在于一个表只能有一个主键约束,但是可以有多个Unique约束:主键所有字段都是not null,unique可以是null:相同点在于都能保证唯

Oracle表中添加外键约束

添加主键约束: ALTER TABLE GA_AIRLINE ADD CONSTRAINT PK_AIRLINE_ID PRIMARY KEY(AIRLINE_ID); 有三种形式的外键约束: 1.普通外键约束(如果存在子表引用父表主键,则无法删除父表记录) 2.级联外键约束(可删除存在引用的父表记录,而且同时把所有有引用的子表记录也删除) 3.置空外键约束(可删除存在引用的父表记录,同时将子表中引用该父表主键的外键字段自动设为NULL,但该字段应允许空值) 这三种外键约束的建立语法如下: 例如

补12.关于mysql的外键约束

一.什么是mysql中的外键(froeign key) 假如说有两张表,其中一张表的某个字段指向了另一张表的主键,这就可以称之为外键(froeign key). 在子表中增加一条记录时,需要确定是否有与父表相对应的记录. 如果父表没有对应的记录,那么子表(从表)无法插入这条数据. 下面是一个关于外键的示例: 1.首先创建一个主表,这个主表存放了班级信息. create table class ( id TINYINT PRIMARY KEY auto_increment, class_name

理解外键约束

--自定义账户访问别的用户的表 select * from scott.emp; select * from scott.dept; --foreign key 外键约束 --创建班级表 create table t_class( cid number(6), cname varchar2(12) ) --方式三:添加班级约束 alter table t_class add constraints pk_class primary key(cid); alter table t_class mo

处理有外键约束的数据

mysql SET FOREIGN_KEY_CHECKS = 0;    delete from  approval_info;delete from approval_manage;delete from site_message;delete from works;delete from works_theme;SET FOREIGN_KEY_CHECKS = 1; oracle drop tablename no CONSTRAINT 还有一个本办法就是 一个一个的找到主键然后外键约束,然

mysql的父子表,外键约束

在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束.外键的使用条件:1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持):2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立: 3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以: 外键的好处:可以使得两张表关联,保证数据的一

修改外键约束的值

取消外键约束 MySQL SET FOREIGN_KEY_CHECKS = 0; -- your sql SET FOREIGN_KEY_CHECKS = 1; SQL server Oracle 原文地址:https://www.cnblogs.com/52liming/p/9535636.html

数据库中为什么不推荐使用外键约束

数据库中为什么不推荐使用外键约束 首先我们明确一点,外键约束是一种约束,这个约束的存在,会保证表间数据的关系"始终完整".因此,外键约束的存在,并非全然没有优点. 作者:孤独烟来源:数据库开发|2018-11-29 14:30 收藏 分享 引言 其实这个话题是老生常谈,很多人在工作中确实也不会使用外键.包括在阿里的JAVA规范中也有下面这一条 [强制]不得使用外键与级联,一切外键概念必须在应用层解决. 但是呢,询问他们原因,大多是这么回答的 每次做DELETE 或者UPDATE都必须考