启用约束时使用exceptions表来跟踪不符合约束的数据并修正

启用约束时使用exceptions表来跟踪不符合约束的数据并修正

使用 EXCEPTIONS 表

1. 创建 EXCEPTIONS 表 (utlexcpt.sql)

2. 使用 EXCEPTIONS 子句执行 ALTER TABLE

3. 使用 EXCEPTIONS 子查询查找包含无效数据的行

4. 纠正错误

5. 再次执行 ALTER TABLE 以启用约束

如何识别行违反

EXCEPTIONS 子句帮助识别任何违反已启用的约束的行按下列步骤检测违反

约束的行为纠正它们并重新启用约束

1 如果还未创建请在管理目录中运行 utlexcpt.sql 脚本以创建异常表

SQL> @?/rdbms/admin/utlexcpt

Statement processed.

SQL> DESCRIBE exceptions

Name Null?Type

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

ROW_ID UNDEFINED

OWNER VARCHAR2(30)

TABLE_NAME VARCHAR2(30)

CONSTRAINT VARCHAR2(30)

在 Windows NT 中该脚本位于

%ORACLE_HOME%\RDBMS\ADMIN 目录下

2 使用 EXCEPTIONS 子句执行 ALTER TABLE 命令

SQL> ALTER TABLE summit.employee

2 ENABLE VALIDATE CONSTRAINT employee_dept_id_fk

3 EXCEPTIONS INTO system.exceptions;

ALTER TABLE summit.employee

*

ORA-02298:cannot enable (summit.EMP_DEPT_FK) - parent keys not

found

如果 EXCEPTIONS 表未用所有者姓名限定则它必须属于正改变

的表的所有者

将行插入 EXCEPTIONS 表中如果重新运行该命令将截断

EXCEPTIONS 表以删除全部现有的行

3 使用 EXCEPTIONS 表上的子查询标识无效数据

SQL> SELECT rowid, id, last_name, dept_id

2 FROM summit.employee

3 WHERE ROWID in (SELECT row_id

4 FROM exceptions)

5 FOR UPDATE;

ROWID ID LAST_NAME DEPT_ID

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

AAAAeyAADAAAAA1AAA 1003 Pirie 50

1 row selected.

4 更正数据中的错误

SQL> UPDATE summit.employee

2 SET id=10

3 WHERE rowid='AAAAeyAADAAAAA1AAA';

1 row processed.

SQL> COMMIT;

Statement processed.

5 截断 EXCEPTIONS 表并重新启用约束

SQL> TRUNCATE TABLE exceptions;

Statement processed.

SQL> ALTER TABLE summit.employee

2 ENABLE VALIDATE CONSTRAINT employee_dept_id_fk

3 EXCEPTIONS INTO system.exceptions;

Statement processed

时间: 2024-10-31 09:25:47

启用约束时使用exceptions表来跟踪不符合约束的数据并修正的相关文章

如何使用Oracle的外部表访问跟踪文件

前面说过Oracle的外部表可以用来访问警告日志文件,其实Oracle的外部表可以非常灵活的被使用. 通过Create Directory命令创建相应的Directory之后,我们可以将目录的访问权限授予其他用户,这样其他用户就能通过外部表访问很多主机上的文件. 我们看一下使用外部表访问跟踪文件的例子(我的例子是用SYS用户来完成的). 首先创建一个指向跟踪文件的Directory: [oracle@jumper oracle]$ sqlplus "/ as sysdba" SQL*P

Word 2013怎样启用选定时自动选定整个单词功能

"选定时自动选定整个单词"就是用户在Word文档中拖动鼠标选定连续单词时,实现以单词为单位而不是以字母为单位的选中效果.Word2000.Word2003.Word2007.Word2010和Word2013均具有该功能.下面以Word2013为例,启用"选定时自动选定整个单词"功能的步骤如下所述: 第1步,打开Word2013文档窗口,依次单击"文件"→"选项"命令,如图2013042203所示. 图2013042203 选

Word2013怎样启用选定时自动选定整个单词功能

  "选定时自动选定整个单词"就是用户在Word文档中拖动鼠标选定连续单词时,实现以单词为单位而不是以字母为单位的选中效果.Word2000.Word2003.Word2007.Word2010和Word2013均具有该功能.下面以Word2013为例,启用"选定时自动选定整个单词"功能的步骤如下所述: 第1步,打开Word2013文档窗口,依次单击"文件"→"选项"命令,如图1所示. 图1 选择"选项"命

dmp-oracle往导入数据时需要的表空间变得很大导致导入中断

问题描述 oracle往导入数据时需要的表空间变得很大导致导入中断 50C 用的oracle11g,我用imp导入一个3g左右的dmp文件,导入用户和表空间都是新建的应该不存在大小不够的问题,我之前试着导入的时候需要的表空间一直增长到了80g左右把我的硬盘都装满了.不知道有没有什么解决方法望指点. 解决方案 http://www.2cto.com/database/201311/254231.html 解决方案二: http://blog.csdn.net/qq275394303/article

many o any-多对多存数据时,中间表没有数据

问题描述 多对多存数据时,中间表没有数据 //action里的add方法public String add(){ model.getRoles().addAll(roleService.getByIds(roleIds)); System.out.println(roleIds[0]);//能正确输出值 System.out.println(model.getRoles());//能正确得到对象 userService.add((User) model); return ""_list

0-android为什么调用拨号程序时向contact表中存入的数据不全

问题描述 android为什么调用拨号程序时向contact表中存入的数据不全 在模拟器通讯录中新建了联系人,设置了头像,但是这个号码,给模拟器拨打电话时,photoId和 number存到contact表中的值为0和null

sql2000数据库-msssql2000创建事务发布时,很多表无法选择发布,这是什么原因?应该怎么解决。

问题描述 msssql2000创建事务发布时,很多表无法选择发布,这是什么原因?应该怎么解决. msssql2000创建事务发布时,很多表无法选择发布.但是快照发布和合并发布都可以全选.

ibatis-Mysql 在A表新增一条数据时,B表的b字段会根据A表的a字段的值增加或减小

问题描述 Mysql 在A表新增一条数据时,B表的b字段会根据A表的a字段的值增加或减小 用ibatis和mysql,用excel导入表格A时, A表有一个字段a每月还款额,B表有一个字段b总金额._两个表根据peopleid关联_. 在A表插入一行新的数据,对应的B表的 某条数据 的字段b总金额发生更新变化. 请问在Action中或sql语句要如何实现这个功能 解决方案 这个用程序来做不是很简单么? 就是在A表插入成功以后执行更新B表的sql语句不就完了么 解决方案二: 在数据库中A表建一个触

access-数据库连接时,在combobox中出现显示ACCESS中所有表名时出现系统表

问题描述 数据库连接时,在combobox中出现显示ACCESS中所有表名时出现系统表 怎么在显示的时候将这些系统表名去除呢? 我在ACCESS中显示表名的时候,系统表没有显示,但是用C#在combobox中显示所有表名时,尽然把系统表都显示出来了,请问怎么改C#语言 解决方案 你可以加上一个判断 if (!表名.Contains("~TMP")) comboBox1.Items.Add(表名); 解决方案二: 这不是系统表,这些都是临时表. sql语句里面过滤一下. 解决方案三: 解