我在Oracle Database 11g企业版11.2.0.4.0版 - 64位生产环境中遇到以下问题。
以下代码在表USER1的主键(ID)[VARCHAR2]上创建唯一索引。它运作正常。
CREATE UNIQUE INDEX USER1_PK ON USER1
(ID)
COMPUTE STATISTICS
LOGGING
TABLESPACE ACT_INDX
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 128K
NEXT 128K
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0
BUFFER_POOL DEFAULT
);
ALTER TABLE USER1 ADD (
CONSTRAINT USER1_PK
PRIMARY KEY
(ID)
ENABLE VALIDATE);
紧急要求希望主键(ID)值不区分大小写(例如,aa-aaa-aaaa,AA-AAA-AAAA,aa-AAA-aaa等被认为是相同的)。
但是,当我通过将(ID)更改为UPPER((ID))来更改代码时,Oracle会在创建约束时抛出SQL错误“ORA-14196:指定的索引不能用于强制执行约束”。如何修改我的代码以提供所需的功能而不会抛出错误。我无法更改表架构。谢谢。
CREATE UNIQUE INDEX USER1_PK ON USER1
UPPER((ID))
COMPUTE STATISTICS
LOGGING
TABLESPACE ACT_INDX
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 128K
NEXT 128K
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0
BUFFER_POOL DEFAULT
);
ALTER TABLE USER1 ADD (
CONSTRAINT USER1_PK
PRIMARY KEY
(ID)
ENABLE VALIDATE);
答案 0 :(得分:0)
对于这些情况,虚拟列是一个方便的(11g +)功能。
alter table user1
add (
uppercase_id generated always as (upper(id))
);
现在你们都为成功做好了准备。
alter table user1
add constraint user1_pk
primary key (uppercase_id)
COMPUTE STATISTICS
TABLESPACE ACT_INDX
;