创建约束时,例外进入子句不起作用

Posted

技术标签:

【中文标题】创建约束时,例外进入子句不起作用【英文标题】:Exceptions into clause does not work when creating a constraint 【发布时间】:2012-06-26 16:05:48 【问题描述】:

我使用 Oracle 11g。 我有一张桌子:

create table test (one number(2), two number(2));

有2行:

insert into test (one, two) values (1, 1);
insert into test (one, two) values (2, null);
commit;

现在我创建一个异常表:

create table exceptions(row_id rowid,
                       owner varchar2(30),
                       table_name varchar2(30),
                       constraint varchar2(30));

现在我想为测试创建主键:

alter table test add constraint test_pk primary key (one, two) exceptions into exceptions;

当然我得到以下错误:ORA-01449

但是导致异常的行不在异常表中?

谁能帮帮我。提前致谢

沃尔夫冈

【问题讨论】:

bash Oracle 线程显然是一种快速获得积分的方法......这个+2 怎么没有一个评论?您得到的错误是告诉您主键字段不能包含空值。这并不意味着 Oracle 异常不起作用。看看你的桌子,你有什么禁忌吗? @tbone,这与异常处理无关。这是关于“例外进入”条款。 OP 所描述的正是这种情况,并且是一个合理的问题,因为文档没有告诉您这些信息。问题是您无法一步创建约束并报告异常。这个“抨击”甲骨文怎么样? @DCookie 我了解“例外进入”条款,但标题是“oracle exceptions do not work”。它不是 Oracle 问题(约束如何在甚至无法创建时记录异常,您必须在加载空值之前先创建它,或者按照您的建议创建它禁用)。一旦创建,它就可以完成它的工作。我只是觉得很有趣,我遇到了几个“为什么 Oracle 很烂”的线程,这些线程会立即获得积分,嗯,我不知道。例如,请参阅***.com/questions/11191299/…。 在这种情况下,我不得不仁慈地假设 OP 不会说英语作为他的第一语言,只是从他的角度描述问题,即例外对他不起作用。 通过重新命名标题解决了问题。 【参考方案1】:

为此,您必须首先创建约束禁用:

ALTER TABLE test ADD CONSTRAINT test_pk PRIMARY KEY (one, two) DISABLE;

然后,启用例外约束:

ALTER TABLE TEST ENABLE CONSTRAINT test_pk EXCEPTIONS INTO exceptions;

然后就可以选择结果了:

SQL> SELECT * FROM EXCEPTIONS;

ROW_ID             OWNER TABLE_NAME CONSTRAINT
------------------ ----- ---------- ----------
AAHpV4AAHAAApliAAB XXX   TEST       TEST_PK

【讨论】:

以上是关于创建约束时,例外进入子句不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 WHERE 子句的查询不起作用

子句之间的 Rownum 不起作用 - Oracle [重复]

通过动画调整 UIView 大小时约束不起作用

旋转设备时约束不起作用

Revenuecat,Flutter - PurchasePackage 不起作用,但没有例外

带有 WHERE 子句和 INNER JOIN 的 MySQL 更新查询不起作用