Oracle - изменить существующую таблицу для автоматического увеличения столбца - PullRequest
4 голосов
/ 07 октября 2011

У меня есть таблица со следующим столбцом:

NOTEID      NUMBER NOT NULL,

Для всех намерений и целей этот столбец является первичным ключом.Эта таблица имеет несколько тысяч строк, каждая с уникальным идентификатором.Ранее приложение ВЫБРАЛО значение MAX () из таблицы, добавляло его, а затем использовало это значение в качестве следующего значения.Это ужасное решение, и оно не защищено от транзакций или потоков (на самом деле, до того, как у них даже не было УНИКАЛЬНОГО ограничения на столбец, и я мог видеть, что один и тот же NOTEID был продублирован в 9 различных случаях) ..

Я довольно новичок в Oracle, поэтому я хотел бы знать лучший синтаксис, чтобы ИЗМЕНИТЬ эту таблицу и сделать вместо этого автоинкремент этого столбца.Если возможно, я бы хотел, чтобы следующее значение в последовательности было MAX (NOTEID) + 1 в таблице, или просто делало его 800 или что-то для начала.Спасибо!

Ответы [ 2 ]

13 голосов
/ 07 октября 2011

Вы не можете изменить таблицу. Oracle не поддерживает декларативные автоинкрементные столбцы. Вы можете создать последовательность

CREATE SEQUENCE note_seq
  START WITH 800
  INCREMENT BY 1
  CACHE 100;

Затем вы можете создать триггер

CREATE OR REPLACE TRIGGER populate_note_id
  BEFORE INSERT ON note
  FOR EACH ROW
BEGIN
  :new.note_id := note_seq.nextval;
END;

или, если вы хотите, чтобы вызывающие абоненты указывали не по умолчанию NOTE_ID

CREATE OR REPLACE TRIGGER populate_note_id
  BEFORE INSERT ON note
  FOR EACH ROW
BEGIN
  IF( :new.note_id is null )
  THEN 
    :new.note_id := note_seq.nextval;
  END IF;
END;
7 голосов
/ 07 октября 2011

Если ваш MAX (noteid) равен 799, попробуйте:

CREATE SEQUENCE noteseq
    START WITH 800
    INCREMENT BY 1

Затем, вставляя новую запись, для столбца NOTEID вы должны сделать:

noteseq.nextval
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...