Создание триггера и последовательности для создания нового первичного ключа

Как я могу написать последовательность и триггер, который при вставке в таблицу проверяет, имеет ли атрибут ID (и INTEGER) значение NULL.

Если значение null, оно должно увеличиваться от 1 вверх, проверяя, является ли само значение первичным ключом, и если нет, оно должно использоваться в качестве первичного ключа для вставки.

В противном случае, если id не равен нулю, он должен обновить строку с заданным идентификатором

У меня это пока есть, но я не уверен в этом

CREATE SEQUENCE create_student_id
START WITH 1
INCREMENT BY 1;

CREATE OR REPLACE TRIGGER new_student_id BEFORE
INSERT ON orders
    IF StudentID == null
    THEN
        FOR EACH ROW BEGIN
            :new.StudentID := create_student_id.nextval;
    END IF
--Need to update the table otherwise
    END;

1 ответ

Решение

Вы пытаетесь реализовать метод upsert? Выполнение проверки индекса внутри триггера кажется мне заменой внутренней работы БД. Но из любопытства следующий фрагмент демонстрирует идею, но не работает в ситуации параллелизма.

CREATE OR REPLACE TRIGGER new_student_id 
  BEFORE INSERT ON orders
FOR EACH ROW BEGIN
  DECLARE count 1 INT;
  IF StudentID == null THEN        
    WHILE (count != 0) LOOP 
      :new.StudentID := create_student_id.nextval;
      SELECT COUNT(1) INTO COUNT FROM orders WHERE StudentID = :new.StudentID
    END LOOP;
    -- If we got to this place the StudentID is now an usable key index 
  END IF;

--Need to update the table otherwise
END;
Другие вопросы по тегам