первичный ключ оракула начать с буквы - PullRequest
2 голосов
/ 11 ноября 2010

Я хочу, чтобы мой первичный ключ моей таблицы в oracle начинался с буквы. Первичный ключ - это nvharchar. Возможный первичный ключ: S1, S291912873123, S123123123. Как я могу это сделать? Спусковой крючок? Любой пример?

Ответы [ 3 ]

7 голосов
/ 12 ноября 2010

Я согласен с Джастином Кейвом. Есть также побочные эффекты на оптимизатор и распределение индекса. Их можно минимизировать, используя формат фиксированной длины с ведущими нулями (т. Е. S0000913, S0000914, S0000915 вместо S913, S914, S915)

Если индексный блок заполнен и его нужно разделить, чтобы добавить ключ, то если блок имеет размер индекса справа, он получает 90/10 разделение. В противном случае он получает 50-50 сплит. Если у вас есть набор ключей, таких как S9, S90, S91, S92 ... S904 ..., то вы получаете до S6034 или что-то еще, вы получаете 50-50 сплит (потому что у вас есть все эти записи S9 на с правой стороны).

Аналогично, при сканировании диапазона «S6034» подходит между «S6» и «S7», хотя 6034 не подходит между 6 и 7.

Подумайте дважды об этом. Альтернативное решение может состоять в том, чтобы иметь компонент 'S' в качестве отдельного поля, которое является либо частью первичного ключа из двух столбцов, либо атрибутом, который вообще не является частью ключа.

6 голосов
/ 11 ноября 2010

Вы всегда хотите добавить 'S' к сгенерированному первичному ключу?Или есть какой-то дополнительный алгоритм, чтобы выяснить, какую букву использовать?Или вы хотите, чтобы буква увеличивалась с течением времени?

Если вы просто добавляете 'S', вы можете сделать что-то вроде

CREATE SEQUENCE your_pk_seq;

CREATE TRIGGER trg_populate_pk
  BEFORE INSERT ON your_table_name
  FOR EACH ROW
BEGIN
  SELECT 'S' || to_char( your_pk_seq.nextval )
    INTO :new.primary_key_column
    FROM dual;
END;

Я бы, однако, предостерег от этогоЕсли вы генерируете синтетический первичный ключ, вам не нужно заботиться о формате.Функционально для вас не должно иметь значения, является ли это число, GUID или что-то еще.И поскольку Oracle предоставляет последовательности для эффективной генерации числовых синтетических ключей, вы действительно должны позволить своим синтетическим первичным ключам быть числовыми.Если 'S' кодирует какой-то другой бит информации, это действительно должно храниться в отдельном столбце (который вы всегда можете объединить с первичным ключом для целей отображения).

0 голосов
/ 11 ноября 2010

Вы можете просто вставить значение, которое хотите использовать в качестве PK.

INSERT INTO MYTABLE (PK) values ('S291912873123')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...