Добавить первичный ключ с автоинкрементом к существующей таблице в oracle [duplicate]

67

Я хочу добавить новый первичный столбец автоматического увеличения в существующую таблицу с данными. Как это сделать?

Сначала я добавил столбец, а затем попытаюсь добавить последовательность после этого, я потерял способ вставки и сделать этот столбец в качестве первичного ключа.

  • 5
    Поразительно, что этот вопрос был просмотрен почти 27000 раз, но только 16 голосов.
Теги:

4 ответа

46
Лучший ответ

Скажите, что ваша таблица называется t1, а ваш первичный ключ называется id
Сначала создайте последовательность:

create sequence t1_seq start with 1 increment by 1 nomaxvalue; 

Затем создайте триггер, который увеличивается при вставке:

create trigger t1_trigger
before insert on t1
for each row
   begin
     select t1_seq.nextval into :new.id from dual;
   end;
  • 0
    Могу ли я изменить идентификатор столбца нового столбца
  • 1
    да, это именно то, что делает :new.id
Показать ещё 2 комментария
25

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

UPDATE table_name
   SET new_pk_column = sequence_name.nextval;

После этого вы можете создать ограничение первичного ключа (это предполагает, что либо нет существующего ограничения первичного ключа, либо вы уже сбросили существующее ограничение первичного ключа)

ALTER TABLE table_name
  ADD CONSTRAINT pk_table_name PRIMARY KEY( new_pk_column )

Если вы хотите сгенерировать ключ автоматически, вам нужно добавить триггер

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

Если вы используете более старую версию Oracle, синтаксис немного более громоздкий

CREATE TRIGGER trigger_name
  BEFORE INSERT ON table_name
  FOR EACH ROW
BEGIN
  SELECT sequence_name.nextval
    INTO :new.new_pk_column
    FROM dual;
END;
  • 0
    Я сделал приведенный выше код, и он отлично работает. но значение идентификатора столбца изменяется, последний вставленный столбец получил идентификатор последнего столбца. но если некоторые из наших коллег вставят данные в таблицу, они начнут со вставки значения столбца первичного ключа, тогда это покажет ошибку. Есть ли способ изменить идентификатор столбца.
  • 0
    @mallikarjun - мне трудно понять, о чем ты спрашиваешь. Что именно кто-то делает? В чем именно ошибка?
Показать ещё 3 комментария
15

Отключен от Oracle OTN forums

Используйте таблицу изменений, чтобы добавить столбец, например:

alter table tableName add(columnName NUMBER);

Затем создайте последовательность:

CREATE SEQUENCE SEQ_ID
START WITH 1
INCREMENT BY 1
MAXVALUE 99999999
MINVALUE 1
NOCYCLE;

и использовать update для вставки значений в столбец, как этот

UPDATE tableName SET columnName = seq_test_id.NEXTVAL
  • 0
    Могу ли я изменить идентификатор столбца нового столбца
  • 0
    Вы хотите сказать, что хотите, чтобы столбец был первым столбцом в таблице, а не концом таблицы?
Показать ещё 3 комментария
5

Вы можете использовать Oracle Data Modeler, чтобы создавать автоматически увеличивающиеся суррогатные ключи.

Шаг 1. - Создание реляционной диаграммы

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

Добавьте сущность (таблица), для которой требуется автоматическое увеличение PK, выберите тип PK как целое.

Шаг 2. - Изменить свойство столбца PK

Получить свойства столбца PK. Вы можете дважды щелкнуть имя столбца или нажать кнопку "Свойства".

Появится диалоговое окно "Свойства столбца".

Выберите вкладку "Общие" (выбор по умолчанию в первый раз). Затем установите флажки "Auto Increment" и "Identity Column".

Шаг 3. - Дополнительная информация

Дополнительная информация, касающаяся автоматического приращения, может быть указана путем выбора вкладки "Автоматическое увеличение".

  • Начать с
  • Приращение
  • Минимальное значение
  • Максимальное значение
  • Цикл
  • Отключить кеш
  • Заказ
  • Имя последовательности
  • Имя триггера
  • Создать триггер

Обычно рекомендуется указывать имя последовательности, так что это будет полезно в PL/SQL.

Нажмите "ОК" ( "Применить" ) в диалоговом окне "Свойства столбца".

Нажмите "ОК" ( "Применить" ) в диалоговом окне "Свойства таблицы".

Таблица отображается в реляционной диаграмме.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню