2014-02-18 2 views
0

Как иметь несколько последовательностей в зависимости от значения конкретного столбца в Oracle; то есть новый Sequence для каждого разного значения для этого столбца.Автоматический сложный составной ключ Oracle

Таблица является:

CREATE TABLE TEST 
    (
     TYPE VARCHAR2(20) NOT NULL , 
     SERIAL_NUM INT NOT NULL, 
     CONSTRAINT TEST_PK PRIMARY KEY 
     (
     TYPE, 
     SERIAL_NUM 
    ) 
     ENABLE 
    ); 

Эта ссылка How to create id with AUTO_INCREMENT on Oracle?

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

Я думал о создании нескольких Sequences для каждого возможного значения в TYPE, создавая Trigger для каждого Sequence и добавления if условия для флирта на основе TYPE значения столбца. Но я понял, что это неправильный подход, так как мне нужно создать новые Sequence и Trigger для любых новых TYPE.

выборки данных должны быть похожи на следующее:

TYPE SERIAL_NUM 
X    1 
X    2 
X    3 
Y    1 
Y    2 
Z    1 
Z    2 
Z    3 
Z    4 

Любые предложения ...

+1

Что мешает вам использовать одну последовательность для всех типов? –

+1

Что такое бизнес-проблема, которую вы хотите решить? Почему у вас есть требование, чтобы строка 'serial_num' была 1 для' type' A, а затем еще одна строка с 'serial_num' из 1 для' type' B? Какая проблема возникает из-за уникальности значений serial_num? Надеюсь, вы не пытаетесь создать набор значений без пробелов ... –

+0

На самом деле, ничто не мешает мне иметь уникальный серийный номер для каждого элемента. Я спрашивал, возможно ли это. Кроме того, что заставляет меня думать об этом, так это то, что у меня есть 'TYPE'column, который является частью первичного ключа, и я думал, что данные будут более организованными и более легкими для прохождения через @FrankSchmitt @JustinCave – Salman

ответ

0

Там нет встроенной функциональности в Oracle для этого.

Решение 1.

Создайте последовательность для каждого типа. Если во время выполнения можно добавить новые типы, вам необходимо выполнить DDL во время выполнения (используя EXECUTE IMMEDIATE). Если есть много типов, вы получите много последовательностей.

Решение 2.

Реализовать свою собственную последовательность, как функциональность в отдельную таблицу с одной строкой для каждого типа, чтобы отслеживать следующее значение. Обязательно используйте SELECT FOR UPDATE и, в общем, помните о проблемах параллелизма, если собираетесь с этой опцией.

CREATE TABLE PseudoSequence (
    TYPE VARCHAR2(20) PRIMARY KEY, 
    SEQ_NO INT NOT NULL 
); 

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

Смежные вопросы