unique constraint 的错误解决

本文介绍了一种在Oracle数据库中进行数据迁移时遇到主键冲突的处理方法。通过使用错误事件记录子句,可以在发生主键冲突时仅拒绝冲突记录而非终止整个插入操作。文章详细展示了如何设置错误日志表、配置事件记录子句以及查询被拒绝的记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  记录错误并继续运行:错误事件记录子句

  假设您正试图将表 ACCOUNTS_NY 的记录插入到表 ACCOUNTS 中。表 ACCOUNTS 在 ACC_NO 列上有一个主键。可能 ACCOUNTS_NY 中的某些行与该主键冲突。尝试使用一个常规的插入语句:

SQL> insert into accounts
2 select * from accounts_ny;
insert into accounts
*
ERROR at line 1:
ORA-00001:unique constraint (ARUP.PK_ACCOUNTS) violated

  表 ACCOUNTS_NY 中的记录均未被装载。现在,将错误事件记录项打开,尝试同样的操作。首先,您需要创建一个表来保存由 DML 语句所拒绝的记录。调用该表 ERR_ACCOUNTS。

exec dbms_errlog.CREATE_ERROR_LOG ('ACCOUNTS','ERR_ACCOUNTS')

  接下来,执行前面的语句,并加入事件记录子句。

SQL> insert into accounts
2 select * from accounts_ny
3 log errors into err_accounts
4 reject limit 200
5 /

6 rows created.

  注意,表 ACCOUNTS_NY 包含 10 行,但只有六行被插入;其他四行由于某种错误而被拒绝。要找出错误是什么,可查询 ERR_ACCOUNTS 表。

SQL> select ORA_ERR_NUMBER$, ORA_ERR_MESG$, ACC_NO

2 from err_accounts;

ORA_ERR_NUMBER$ ORA_ERR_MESG$ ACC_NO
--------------- -------------------------------------------------- ------
1 ORA-00001:unique constraint (ARUP.PK_ACCOUNTS) vi 9997
olated
1 ORA-00001:unique constraint (ARUP.PK_ACCOUNTS)vi 9998
olated
1 ORA-00001:unique constraint (ARUP.PK_ACCOUNTS) vi 9999
olated
1 ORA-00001:unique constraint (ARUP.PK_ACCOUNTS) vi 10000
olated

  请注意列 ORA_ERR_NUMBER$,它显示在 DML 语句执行期间所遇到的 Oracle 错误号,还有 ORA_ERR_MESG$,它显示错误消息。在本例中,您可以看到四条记录被丢弃是因为它们与主键约束 PK_ACCOUNTS 相冲突。该表还捕获表 ACCOUNTS 的所有列,包括列 ACC_NO。查看被拒绝的记录,注意这些帐号已经在表中存在,因此这些记录由于 ORA-00001 错误而被拒绝。如果没有错误事件记录子句,则整个语句将会出错,不会拒绝任务记录。通过这个子句,只有无效的记录被拒绝;其他所有记录均得以接受。 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值