Oracle中不区分大小写的主键

Oracle中不区分大小写的主键,oracle,Oracle,数据的语义不区分大小写,因此我们将oracle会话配置为不区分大小写: alter session set NLS_COMP=LINGUISTIC; alter session set NLS_SORT=BINARY_AI; 然后,为了利用索引,我们还希望主键也不区分大小写: create table SCHEMA_PROPERTY ( NAME nvarchar2(64) not null, VALUE nvarchar2(1024), constraint SP_PK p

数据的语义不区分大小写,因此我们将oracle会话配置为不区分大小写:

alter session set NLS_COMP=LINGUISTIC;
alter session set NLS_SORT=BINARY_AI;
然后,为了利用索引,我们还希望主键也不区分大小写:

create table SCHEMA_PROPERTY (
  NAME  nvarchar2(64)   not null,
  VALUE nvarchar2(1024),
  constraint SP_PK primary key (nlssort(NAME))
)
但是,这会遇到“ORA-00904::invalid identifier”,因此我假设不可能在PK定义中使用nlssort()函数

下一次尝试是将不区分大小写的唯一索引与主键关联:

create table SCHEMA_PROPERTY (
  NAME  nvarchar2(64) primary key using index (
      create unique index SP_UQ on SCHEMA_PROPERTY(nlssort(NAME))),
  VALUE nvarchar2(1024)
);
但这也失败了:

Error: ORA-14196: Specified index cannot be used to enforce the constraint.
14196. 00000 -  "Specified index cannot be used to enforce the constraint."
*Cause:    The index specified to enforce the constraint is unsuitable
           for the purpose.
*Action:   Specify a suitable index or allow one to be built automatically.
我是否应该断定Oracle不支持PK约束的不区分大小写语义?这在MSSQL中工作得很好,MSSQL具有处理排序规则的更简单方法

当然,我们可以创建一个唯一的索引而不是主键,但我想首先确保不支持正常的方法


我们的oracle版本是11.2.0.1。

在11.2上,您可以使用虚拟列来实现这一点:

CREATE TABLE SCHEMA_PROPERTY (
   REAL_NAME  nvarchar2(64) not null,
   NAME       generated always as (lower(real_name)) primary key,
   VALUE nvarchar2(1024)
);

创建唯一索引以强制执行不区分大小写的PK:

create table SCHEMA_PROPERTY (
  NAME  nvarchar2(64),
  VALUE nvarchar2(1024),
  constraint SP_PK primary key (NAME)
);

create unique index SP_UN on SCHEMA_PROPERTY(lower(NAME));

lower()和nlssort()之间没有区别。我在文章中的观点是,似乎不可能基于函数定义PK。PK只能基于实际列。@BogdanCalmac:你说得对,对不起,在发布之前应该测试一下。使用11.x有一个解决办法,请参见我的编辑。我们还必须支持Oracle 10g,但即使没有它,它看起来也比使用唯一索引而不是主键更难看。@BogdanCalmac:如果您可以使用唯一索引,那么一定要使用它!我认为您需要PK定义来创建该表的外键。