Первичный ключ без учета регистра в Oracle - PullRequest
3 голосов
/ 02 ноября 2011

Семантика наших данных нечувствительна к регистру, поэтому мы настраиваем сеансы оракула с учетом регистра:

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:: неверный идентификатор", поэтому я предполагаю, что невозможно использовать функцию nlssort () в определении PK.

Следующая попытка состояла в том, чтобы связать независимый от регистра уникальный индекс с первичным ключом:

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, который имеет более простой подход к работе с сопоставлениями.

Конечно, мы могли бы создать уникальный индекс вместо первичного ключа, но сначала я хотел убедиться, что это нормальный способ.это не поддерживается.

Наша версия Oracle - 11.2.0.1.

1 Ответ

4 голосов
/ 02 ноября 2011

Поскольку вы находитесь на 11.2, вы можете использовать виртуальный столбец для достижения этого:

CREATE TABLE SCHEMA_PROPERTY (
   REAL_NAME  nvarchar2(64) not null,
   NAME       generated always as (lower(real_name)) primary key,
   VALUE nvarchar2(1024)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...