Хороший способ добавить уникальное ограничение к существующей таблице для БД Oracles? - PullRequest
3 голосов
/ 01 декабря 2011

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

Каков наилучший способ добавить уникальный столбец к нему? Желательно создать последовательность для него, пока я в нем.

1 Ответ

3 голосов
/ 01 декабря 2011

Вы можете добавить дополнительный столбец в таблицу с ALTER TABLE

ALTER TABLE table_name
  ADD( new_column_name NUMBER UNIQUE );

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

CREATE SEQUENCE sequence_name;

CREATE TRIGGER trigger_name
  BEFORE INSERT ON table_name
  FOR EACH ROW
BEGIN
  :new.new_column_name := sequence_name.nextval;
END;

Если вы используете версию Oracle до 11g, ваш триггер должен будет сделать SELECT из DUAL, чтобы заполнить столбец :new.new_column_name, а не делать прямое присвоение

CREATE TRIGGER trigger_name
  BEFORE INSERT ON table_name
  FOR EACH ROW
BEGIN
  SELECT sequence_name.nextval
    INTO :new.new_column_name 
    FROM dual;
END;

Предположительно, вы также хотите инициализировать все существующие строки, используя значение последовательности, прежде чем начнете вставлять новые строки

UPDATE table_name
   SET new_column_name = sequence_name.nextval
 WHERE new_column_name IS NULL

Но, кажется, очень странно добавлять новый столбец, сгенерированный последовательностью, в существующую таблицу с составным первичным ключом, если только целью не было использование этого нового столбца в качестве первичного ключа. Смысл создания столбца, сгенерированного последовательностью, заключается в том, что у вас есть стабильный синтетический первичный ключ, который не зависит от реальных бизнес-данных. Таким образом, было бы гораздо разумнее удалить существующий первичный ключ, добавить новый столбец, заполнить данные, объявить новый столбец как новый первичный ключ, а затем определить уникальное ограничение для трех столбцов, которые составляли старый первичный ключ.

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