oracle中查询所有外键引用到某张表的记录

其实查找这篇文章  我主要用的sql 是这句  select * from user_cons_columns t where t.constraint_name like ‘FK_CTS_CONT_REINS__CRR‘;

起因:

系统测试的时候发现如果某条记录已经被引用了,这个时候删除这条记录会引起数据不一致,系统会报错。比如警员信息,在考勤记录表里会引用警员ID,如果考勤记录表中已经存在这个警员ID了,这时从警员表中删除该警员,就会引起数据不一致,前台报错。所以,这个时候我就想查找数据库中所有引用这个ID的表

一:约束类型简介

约束用于确保数据库数据满足特定的商业逻辑或者企业规则,如果定义了约束,并且数据不符

合约束,那么DML操作(INSERT、UPDATE、DELETE)将不能成功执行。约束包括NOT NULL、UNIQUE、PRIMARY KEY、FOREING KEY 以及CHECK等五种类型

NOT NULL约束:

NOT NULL 约束强制列不接受 NULL 值。

UNIQUE约束:

UNIQUE 约束唯一标识数据库表中的每条记录。

PRIMARY KEY 约束:

PRIMARY KEY 约束唯一标识数据库表中的每条记录。主键必须包含唯一的值。

每个表应该都一个主键,并且每个表只能有一个主键。主键列不能包含 NULL 值。

FOREING KEY约束:

外部键列的数据必须在主表的主键列(或惟一列)中存在,或者为NULL,

CHECK约束:

CHECK 约束用于限制列中的值的范围。

如果对单个列定义 CHECK 约束,那么该列只允许特定的值。

如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。

二:Oracle数据字典中查看约束信息

1、我们创建的对象可以从"USER_"开通的视图中查看。如果在模式中创建了10张表,那么从USER_TABLES中查询将返回10行,每一行是关于一张表的特性信息

USER_TABLES不能查看非当前用户模式下创建的表。

ALL_TABLES视图不但显示当前用户模式下创建的表,而且显示授权能够访问的表信息

我们关心的视图以下列前缀命名:

·USER_  当前用户模式下创建的对象

·ALL_   当前用户模式下创建的对象加上当前用户能访问的其他用户创建的对象。ALL视图常常包含一个"OWNER"列,反映出能够访问的对象的所有者。在USER_TABLES表中不能看到OWNER列是因为你就是在这个视图中所有表的所有者;在ALL_TABLES中有一个OWNER字段。

·DBA_   它提供了整个数据库的信息。包括数据库中所有表的名字和拥有者——包括SYS模式下的基本表

这些前缀在限制我们想看到的、需要看到的、应当被允许看到的范围上是一个帮助。查看当前模式下创建的表,查询USER_TABLES;

查看所有我们创建的表以及被授权可以从其他用户模式下访问的表,查询ALL_TABLES;

具有DBA或SELECT_CATALOG_ROLE角色的用户可以查询DBA_TABLES来查询数据库中所有表的列表;

不是所有视图下都有一个USER、ALL、和DBA前缀,有一些视图仅存在于dba视图范围。比如:DBA_DATA_FILES。

在开发环境中有时会访问DBA视图,允许开发人员探究Oracle数据字典是没有害处的。你可以在不拥有DBA角色的情况下获得这个权限。一般,把CONNECT和RESOURCE角色给应用开发者,他不能访问这些,你可以把SELECT ANY TABLE权限或SELECT_CATALOG角色赋给一个用户,这样他将被允许访问整个数据字典。

一个人对数据字典理解的越多,越能接触到数据库中复杂的操作,越能对SQL语句优化敏感。

2、数据字典视图:概要

在数据字典视图中有一些隐含的关系。发现这些关系常常是使用SQL查询对数据字典验证的结果,幸运的是,在数据字典中有许多使用名称的特征。

例如:USER_TABLES表中每一个表包含一个单独的行。每一行包含一张表的详细信息,比如表的物理存储参数。这些数据提供的扩展信息告诉你表是怎么增长的。

USER_TAB_COLUMNS视图中在USER_TABLES表中的每一张表的每一行包含一条记录。如果一张表有10个字段,那么,你将在USER_TAB_COLUMNS表中找到10行记录,是关于每一字段的详细信息。比如字段数据类型。字段名TABLE_NAME在USER_TABLE 和USER_TAB_COLUMNS表中都有,因此可以很容易的把他们连接起来。

USER_OBJECTS   用户对象视图

ALL_OBJECTS    所有对象视图

DBA_OBJECTS    DBA对象视图

USER_SEQUENCES   用户序列对象视图,在USER_SEQUENCES的记录也会出现在USER_OBJECTS表中

3、约束视图

有两个数据字典视图提供了约束的详细信息。USER_CONSTRAINTS和USER_CONS_COLUMNS.

一张表可能有也可能没有约束,对于一张表的每一个约束在USER_CONSTRAINTS中都有一条记录描述这个约束。包括约束应用到的表名称。如果你知道约束名想知道约束类型,查询USER_CONSTRAINTS表。这个视图描述了约束的定义。它不提供约束定义在哪些字段名称上。USER_CONSTRAINTS中CONSTRAINT_NAME中表示约束名,如果建立表的时候没有指定约束名,系统默认的约束名类似“SYS_C006274”这样的一串字母。R_CONSTRAINT_NAME是外键引用表主键的约束名。CONSTRAINT_TYPE字段中P:表示主键,R:表示外键,C表示NOT NULL或CHECK,U表示UNIQUE

在USER_CONS_COLUMNS视图中显示约束的字段名称。如果主键是个联合主键,这个视图中将有这个约束的两条记录。联合主键的每一个字段对应一条记录。每一条记录通过POSITION(在联合主键中的位置)来区别。可以根据CONSTRAINT_NAME字段将USER_CONSTRAINTS和USER_CONS_COLUMNS关联起来。

三:得到想要的结果

分为两步:

//查询表的主键约束名

select * from user_constraints e where e.table_name=’’—-处输入表名

//查询所有引用到该主键的记录

select b.table_name,b.column_name from user_constraints a

inner join user_cons_columns b

on a.constraint_name = b.constraint_name

where a.r_constraint_name=‘‘—此处输入刚才查询出来的表主键的约束名

时间: 2024-10-26 07:59:59

oracle中查询所有外键引用到某张表的记录的相关文章

oracle高级查询(实例基于scott用户四张表)

oracle高级查询(实例基于scott用户四张表) 分组查询 多表查询 子查询 综合实例 ======================================================================= scott用户的四张表(emp,dept,bonus,salgrade) 没有这四张表的可参考http://blog.csdn.net/love_legain/article/details/54311040进行创建 -----------------------

Navicat for Oracle中如何使用外键

转自:https://blog.csdn.net/weixin_39183543/article/details/80555104 1. 外键名最后保存的时候自动生成: 2. 参考模式自动生成: 3.参考表即外键表. 选中参考表,参考限制自动提示: 4.参考栏位为外键表的关联字段: 4.栏位为当前表的关联字段: 启用. 5.删除时:下拉列表定义采取行动的类型. No Action:默认无动作.参考键值将不会更新或删除. CASCADE:级联-,分别删除任何参考已删除的行,或更新参考列为被参考的新

在oracle中查询已知表名的表中所有字段名,每个字段是否是主键,是否是外键,是否为空的sql语句

查询表的所有列及其属性:select t.*,c.COMMENTS from user_tab_columns t,user_col_comments c where t.table_name = c.table_name and t.column_name = c.column_name and t.table_name = women;查找表的主键:select cu.* from user_cons_columns cu, user_constraints au where cu.cons

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

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

django 中新添加外键后一直报错

在模型中添加了外键,然后一直显示**_id无数值 原因在于在model中新添加字段,没有写进数据库 正确操作为: 首先,进入开发环境(也就是说,不是在发布环境里): 1.在你的模型里添加字段. 2.运行 manage.py sqlall [yourapp] 来测试模型新的 CREATE TABLE 语句. 注意为新字段的列定义. 3.开启你的数据库的交互命令界面(比如, psql 或mysql , 或者可以使用 manage.py dbshell ). 执行 ALTER TABLE 语句来添加新

django中的数据库外键操作

以MYSQL为例: (1)在model中定义两个数据表,食物信息和食物类别信息 class foodInfo(models.Model): food_id = models.AutoField(max_length=4)   #自定义主键,不指定主键默认会生成一个名为'ID'列的主键 food_name = models.CharField(max_length=10) food_content = models.CharField(max_length=100) food_price = mo

关?于?h?i?b?e?r?n?a?t?e?中?双?向?外?键?关?联?o?n?e?-?t?o?-?o?n?e?的?p?r?o?p?e?r?t?y?-?r?e?f?=?的?问?题(转)

大家都知道hibernate中的one-to-one映射主要有两种策略,(1)一对一主键关联(单向和双向).(2)一对一外键映射(单项和双向).本文主要讲解一下,一对一外键映射中的双向问题,在此前先通过一个实例了解. person和idCard,是一种一对一的关系,其中   t_person表 id        name       idCard(unique) 1         张三 2         王五       1 其中王五是没有idcard,这也符合现实中的,有些人是没有身份证

SQLServer:查询所有外键关联表信息

--从左到右分别是: 外键约束名,子表名,外键列名,父表名 --use demodtcms--外键信息select fk.name fkname , ftable.name ftablename, cn.name fkcol, rtable.name ftablename,ObjectProperty(fk.id,'CnstIsUpdateCascade') updatCase,ObjectProperty(fk.id,'CnstIsDeleteCascade') deletCase from

【数据库】主键,外键,主表,从表,关联表,父表,子表

转自:https://www.2cto.com/database/201707/662425.html 一.前言 在数据库设计中,hibernate,iBatis等ORM框架的使用中经常听说主键,外键,主表,从表,关联表,父表,子表之类的术语,弄懂它们之前的区别与联系对于数据库设计和ORM框架的学习使用是非常有必要的. 二.概述 下面从数据库设计角度,ORM框架使用(以Hibernate为例),PowerDesigner软件以及实际业务角度进行一下介绍. (1) 数据库角度而言 主键:一般情况下