【问题标题】:Oracle SQL -- Case Insensitive Primary KeyOracle SQL——不区分大小写的主键
【发布时间】:2018-04-19 04:48:42
【问题描述】:

我在 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production 下遇到以下问题。

以下代码在表 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: Specified index cannot be used to enforce the constraint”。如何修改我的代码以提供所需的功能而不会引发错误。我无法更改表架构。谢谢。

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);

【问题讨论】:

  • 在 dba.stackexchage.com 上获得此问题的答案,您可能会更开心

标签: oracle11g primary-key case-insensitive


【解决方案1】:

对于这些情况,虚拟列是一个方便的 (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
;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多