oracle 主外键管理

使用主外键约束使得数据具有完整性。

1、查询表上所有的约束

select * from user_constraints t

where t.table_name=‘FATHER‘;

2、查询具有主外键关系的表

select c.owner,c.constraint_name,c.constraint_type,c.table_name,f.owner,f.constraint_name,f.constraint_type,f.table_name

from dba_constraints c, dba_constraints f

where c.r_owner=f.owner

and c.r_constraint_name=f.constraint_name

and c.table_name=‘CHILD‘;  --查询子表CHILD对应的所有父表

3、子表中插入的记录必须在父表中存在,否则会报parent key not found

SQL> insert into child values (‘datong‘,1);

insert into child values (‘datong‘,1)

*

ERROR at line 1:

ORA-02291: integrity constraint (SCOTT.FK_ADDR) violated - parent key not found

4、父表的记录只有在子表中找不到才可以删除,否则会报child record found

SQL> delete from father where id=1;

delete from father where id=1

*

ERROR at line 1:

ORA-02292: integrity constraint (SCOTT.FK_ID) violated - child record found

SQL> delete from father where id=2;

1 row deleted.

SQL> commit;

Commit complete.

5、如何完全删除父表数据,如truncate、drop

SQL> truncate table father;

truncate table father

*

ERROR at line 1:

ORA-02266: unique/primary keys in table referenced by enabled foreign keys

针对上面情况,可以先将father表的所有子表的引用约束disable,使用下面的sql得到禁用子表约束语句:

select ‘alter table ‘||c.owner||‘.‘||c.table_name||‘ modify constraint ‘||c.constraint_name||‘ disable;‘ "exec_sql"

from user_constraints c, user_constraints f

where c.r_owner=f.owner

and c.r_constraint_name=f.constraint_name

and f.table_name=‘FATHER‘;

exec_sql

-------------------------------------

alter table SCOTT.CHILD modify constraint FK_ID disable;

然后执行上面的查询结果,就可以禁掉所有的子表约束,truncate父表就不会报错了。

SQL> alter table SCOTT.CHILD modify constraint FK_ID disable;

Table altered.

SQL> truncate table father;

Table truncated.

当然,此时子表的引用约束不一定能起来(enable),取决于子表是否有数据。

SQL> alter table SCOTT.CHILD modify constraint FK_ID enable;

alter table SCOTT.CHILD modify constraint FK_ID enable

*

ERROR at line 1:

ORA-02298: cannot validate (SCOTT.FK_ID) - parent keys not found

将子表数据全部删除,就可以起来(enable)子表的引用约束。

SQL> truncate table child;

Table truncated.

SQL> alter table SCOTT.CHILD modify constraint FK_ID enable;

Table altered.

SQL> drop table father;

drop table father

*

ERROR at line 1:

ORA-02449: unique/primary keys in table referenced by foreign keys

这种情况可以使用cascade constraints子句一同将子表的引用约束删掉。

SQL> drop table father cascade constraints;

Table dropped.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-18 23:55:28

oracle 主外键管理的相关文章

oracle主从表主外键对应关系

一.首先让我们来了解下什么是主外键? 1.主键:唯一标识数据表中的某一行 1) 一个表中只能有一个主键.如果在其他字段上建立主键,则原来的主键就会取消.在ACCESS中,虽然主键不是必需的,但最好为每个表都设置一个主键. 2)主键的值不可重复,也不可为空(NULL).主关键字是可选的,并且可在 CREATE TABLE 或 ALTER TABLE 语句中定义. 3)主键的创建:在建置新表格时设定主键的方式 MySQL:  CREATE TABLE Customer (SID integer,La

字段约束,索引,主外键

                                                    第二节   字段约束,索引,主外键 字段约束条件 1.1作用:限制如何给字段赋值的 1.2包括内容有:NULL Key Default Extra NULL是否允许给字段赋null值 null默认允许赋null值 not null不允许赋null值 key键值类型:普通索引唯一索引全文索引主键外键 Default默认值作用:当不被字段赋值时,使用默认值给字段赋值 不设置默认值是系统定义的是nu

关于表的主外键关系练习 师生 分数表

--创建三个表 --表一:学生表 student--学号:code int (主键)从1开始--姓名:name varchar(50)--性别:sex char(10)--班级:banji char(10)--语文教师编号:yujiao int --数学教师编号:yujiao int --英语教师编号:yujiao int --表二:教师表 teacher--教师名字:name --教师编号:code int (主键) 从1001开始--负责课程:lesson char(10)(语文.数学.英语

ASP.NET MVC5 用CodeFirst做网站遇到的问题——主外键冲突

数据库中存在complainsuggest的Id然后再此基础上,建立投诉的回复Answer.但是老是会报主外键冲突,一直在网上百度.说是因为在complainSuggest上没有Id,对于answer需要其Id为外键,所以冲突.但是找了数据库根本就没有这个问题. 然后反过来找之前建立的实体和上下文中的表间关系.然后就发现自己对于表间关系的建立并不是很熟练,所以导致了各种错误. 最后把一对一的表间关系变成这个样子才可以,但是我感觉这个一对一的表间关系和一对多的表间关系看起来是一样的. 但是他就是合

清除oracl中有主外键关联的表中的部分数据。

1.禁用主外键BEGINfor c in (select 'ALTER TABLE '||TABLE_NAME||' DISABLE CONSTRAINT '||constraint_name||' ' as v_sql from user_constraints where CONSTRAINT_TYPE='R') loop EXECUTE IMMEDIATE c.v_sql;end loop;end;2.清空数据源.清空所有数据.一般情况是对表进行条件删除.begin for ec in (

MySql不支持主外键

创建表不支持主外键,能够添加外键成功,但是无法外键约束.查资料发现MySql的默认ENGINE 为MyISAM  ,不支持外键,需要修改为 INNODB 修改前: 1 Create Table 2 3 CREATE TABLE `person` ( 4 `id` varchar(32) NOT NULL, 5 `NAME` varchar(30) DEFAULT NULL, 6 PRIMARY KEY (`id`) 7 ) ENGINE=InnoDB DEFAULT CHARSET=gbk 在创

SQLserver中的视图与主外键的创建

一.背景 原来学过数据库的相关内容,只是形式上的,从来也没有实践过,徐徐飘过而已,如今在做机房时,很多知识需要用到视图,才开始去慢慢的实践. 视图:我理解的就是一张表,它把我们所需要的某个表或某几个表中的部分信息提取出来,形成了一张临时的表. 它主要有两个优点:1.简单,它呈现给我们的数据就是我们想要的数据,没有多余的. 2.安全,提供给用户它们权限范围内的数据 我为什么会用到视图?举一个简单的例子,在查询用户信息时,我们可能会用到两张表中的内容.那么这个时候我就需要将两张表中我需要的数据提取出

数据库的SQL语句创建和主外键删除操作

1 create table UserType 2 3 ( 4 5 Id int primary key identity(1,1), Name nvarchar(25) not null 6 7 ) go 1 create table UserInfo 2 3 ( 4 5 Id int primary key identity(1,1), LoginPwd varchar(50) not null, LoginName varchar(50) not null, Name varchar(25

SQL SERVER中获取表间主外键关系

sql server 2008中的主外键关系获取方式: 转自:http://www.cnblogs.com/ke10/archive/2012/06/11/2544655.html SELECT OBJECT_NAME(con.constid) '关系名' ,OBJECT_NAME(sf.fkeyid) '主键表' ,fcol.name '主键' ,OBJECT_NAME(sf.rkeyid) '外键表' ,rcol.name '外键',st.name'数据类型'FROM sysforeignk