重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
以下的文章主要是对Oracle主键与Oracle外键的实际应用方案的介绍 此篇文章是我很然偶在一网站上发现的 如果你对Oracle主键与Oracle外键的实际应用很感兴趣的话 以下的文章就会给你提供更详细的相关方面的知识
网站设计制作过程拒绝使用模板建站;使用PHP+MYSQL原生开发可交付网站源代码;符合网站优化排名的后台管理系统;网站设计、成都网站设计收费合理;免费进行网站备案等企业网站建设一条龙服务.我们是一家持续稳定运营了十余年的成都创新互联网站建设公司。
CREATE TABLE SCOTT MID_A_TAB
( A VARCHAR ( BYTE)
B VARCHAR ( BYTE)
DETPNO VARCHAR ( BYTE)
)TABLESPACE USERS ;
CREATE TABLE SCOTT MID_B_TAB
( A VARCHAR ( BYTE)
B VARCHAR ( BYTE)
DEPTNO VARCHAR ( BYTE)
)TABLESPACE USERS ;
给MID_A_TAB表添加主键
alter table mid_a_tab add constraint a_pk primary key (detpno);
给MID_B_TAB表添加Oracle主键
alter table mid_b_tab add constraint b_pk primary key(a);
给子表MID_B_TAB添加Oracle外键 并且引用主表MID_A_TAB的DETPNO列 并通过on delete cascade指定引用行为是级联删除
alter table mid_b_tab add constraint b_fk foreign key
(deptno) references mid_a_tab (detpno) on delete cascade;
向这样就创建了好子表和Oracle主表
向主表添加数据记录
SQL insert into mid_a_tab(a b detpno) values( );
已创建 行
已用时间: : :
向子表添加数据
SQL insert into mid_b_tab(a b deptno) values( );
insert into mid_b_tab values( )
*
第 行出现错误:
ORA : 违反唯一约束条件 (SCOTT B_PK)
已用时间: : :
可见上面的异常信息 那时因为子表插入的deptno的值是 然而此时我们主表中
detpno列只有一条记录那就是 所以当子表插入数据时 在父表中不能够找到该引用
列的记录 所以出现异常
但我们可以这样对子表的数据的进行插入(即 在子表的deptno列插入null 因为我们在建表的时候
并没有对该列进行not null的约束限制)
SQL insert into mid_b_tab(a b deptno) values( null);
已创建 行
已用时间: : :
现在如果我们把子表mid_b_tab中deptno列加上not null约束
SQL alter table mid_b_tab modify deptno not null;
alter table mid_b_tab modify deptno not null
*
第 行出现错误:
ORA : 无法启用 (SCOTT ) 找到空值
已用时间: : :
上面又出现异常 这是因为现在mid_b_tab表中有了一条记录 就是我们先前添加的
那条记录
null
现在我们要把该表的deptno列进行not null约束限制 所以Oracle不让我们这样干
那我们就只有把该表给delete或truncate掉 然后在修改deptno列为非空
SQL delete from mid_b_tab;
已删除 行
已用时间: : :
再次修改子表mid_b_tab表的deptno列为非空
SQL alter table mid_b_tab modify deptno not null;
表已更改
已用时间: : :
修改成功!
我们再次插入数据
insert into mid_b_tab(a b deptno) values( null);
试试
SQL insert into mid_b_tab(a b deptno) values( null);
insert into mid_b_tab(a b deptno) values( null)
*
第 行出现错误:
ORA : 无法将 NULL 插入 ( SCOTT MID_B_TAB DEPTNO )
已用时间: : :
看见现在Oracle不让我们插入空值了
所以我们在创建子表的Oracle外键约束时 该表的引用列必须要进行not null限制 也可以在
该列创建unique 或primary key约束 并且引用列与被引用列的数据类型必须相同
SQL insert into mid_b_tab(a b deptno) values( );
已创建 行
已用时间: : :
此时数据插入成功 因为此时插入的 在主表中的被引用列中已经存在了
现在我们一系列的操作
SQL select * from mid_b_tab ;
A B DE
已用时间: : :
SQL select * from mid_a_tab;
A B DE
已用时间: : :
SQL delete from mid_a_tab;
已删除 行
lishixinzhi/Article/program/Oracle/201311/18331
以oracle自带的用户scott为例。
create table dept(
deptno number(2) primary key, --deptno 为 dept表的主键
dname varchar2(10),
loc varchar2(9)
);
create table emp(
empno number(4) primary key, --empno 为 emp表的主键
ename varchar2(10),
job varchar2(9),
mgr number(4),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno number(2) references dept(deptno) --dept表中deptno字段 为 emp表的外键
);
主键:ALTER TABLE A ADD CONSTRAINT PK_XXX PRIMARY KEY (XXX)
外键;ALTER TABLE B ADD CONSTRAINT FK_YYY FOREIGN KEY(YYY) REFERENCES A(XXX)
B表的YYY字段 引用A表的XXX字段值域为自身值域
主键约束,外键约束就是这样建立的
删除约束: ALTER TABLE A DROP CONSTRAINT 约束名
Oracle的外键用来限制子表中参考的字段的值 必须在主表中存在 而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时 定义了一系列的动作
在SQL 标准中定义了几种外键改变后 如何处理子表记录的动作 其中包括
限制Restrict 这种方式不允许对被参考的记录的键值执行更新或删除的操作 置为空Set to null 当参考的数据被更新或者删除 那么所有参考它的外键值被置为空
置为默认值Set to default 当参考的数据被更新或者删除 那么所有参考它的外键值被置为一个默认值
级联Cascade 当参考的数据被更新 则参考它的值同样被更新 当参考的数据被删除 则参考它的子表记录也被删除
不做操作No action 这种方式不允许更新或删除被参考的数据 和限制方式的区别在于 这种方式的检查发生在语句执行之后 Oracle默认才会的方式就是这种方式
Oracle明确支持的方式包括No action Set to null和Cascade 对于Set to Default和Restrict Oracle的约束类型并不直接支持 不过可以通过触发器来实现
简单看一下Oracle的默认处理方式No action
SQL CREATE TABLE T_P (ID NUMBER NAME VARCHAR ( ));
表已创建
SQL ALTER TABLE T_P ADD PRIMARY KEY (ID);
表已更改
SQL CREATE TABLE T_C (ID NUMBER FID NUMBER NAME VARCHAR ( ));
表已创建
SQL ALTER TABLE T_C ADD CONSTRAINT FK_T_C FOREIGN KEY (FID) REFERENCES T_P (ID);
表已更改
SQL INSERT INTO T_P VALUES ( A );
已创建 行
SQL INSERT INTO T_P VALUES ( B );
已创建 行
SQL INSERT INTO T_C VALUES ( A );
已创建 行
SQL MIT;
提交完成
对于No Action操作而言 如果主键的记录被外键所参考 那么主键记录是无法更新或删除的
SQL DELETE T_P WHERE ID = ;DELETE T_P WHERE ID = *第 行出现错误:ORA : 违反完整约束条件 (YANGTK FK_T_C) 已找到子记录日志
SQL UPDATE T_P SET ID = WHERE ID = ;UPDATE T_P SET ID = WHERE ID = *第 行出现错误:ORA : 违反完整约束条件 (YANGTK FK_T_C) 已找到子记录日志
SQL DELETE T_P WHERE ID = ;
已删除 行
不过No Action又和Restrict操作有所区别 No Action允许用户执行语句 在语句执行之后 或者事务结束的时候才会检查是否违反约束 而Restrict只有检测到有外键参考主表的记录 就不允许删除和更新的操作执行了
这也使得No Action操作支持延迟约束
SQL ALTER TABLE T_C DROP CONSTRAINT FK_T_C;
表已更改
SQL ALTER TABLE T_C ADD CONSTRAINT FK_T_C FOREIGN KEY (FID) REFERENCES T_P (ID) DEFERRABLE INITIALLY DEFERRED;
表已更改
SQL SELECT * FROM T_P;
ID NAME A
SQL SELECT * FROM T_C;
ID FID NAME A
SQL DELETE T_P WHERE ID = ;
已删除 行
SQL INSERT INTO T_P VALUES ( A );
已创建 行
SQL MIT;
提交完成
lishixinzhi/Article/program/Oracle/201311/17487
SQL drop table Stu;
drop table Stu
*
ERROR 位于第 1 行:
ORA-00942: 表或视图不存在
SQL create table Stu(
2 sno varchar2(10) primary key,
3 sname varchar2(10) not null,
4 sex varchar2(5) check(sex='男'or sex='女'),
5 class varchar2(10),
6 spasswd varchar2(10)
7 );
表已创建。
SQL drop table Cou;
drop table Cou
*
ERROR 位于第 1 行:
ORA-00942: 表或视图不存在
SQL create table Cou(
2 cno varchar2(10) primary key,
3 cname varchar2(30) not null,
4 kcxz varchar2(20),
5 lesson_hours number(4),
6 test_hours number(4),
7 credit number(3)
8 );
表已创建。
SQL drop table SC;
drop table SC
*
ERROR 位于第 1 行:
ORA-00942: 表或视图不存在
SQL create table SC(
2 sno varchar2(10),
3 cno varchar2(10),
4 grade number(3),
5 primary key(sno,cno)
6 );
表已创建。
SQL
SQL
SQL ALTER TABLE SC ADD CONSTRAINT fk_SC_Stu FOREIGN KEY (sno) REFERENCES Stu;
表已更改。
SQL
SQL ALTER TABLE SC ADD CONSTRAINT fk_SC_Cou FOREIGN KEY (cno) REFERENCES Cou;
表已更改。
SQL