创建约束时,例外进入子句不起作用
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
【讨论】:
以上是关于创建约束时,例外进入子句不起作用的主要内容,如果未能解决你的问题,请参考以下文章
子句之间的 Rownum 不起作用 - Oracle [重复]