Создание триггера и последовательности для создания нового первичного ключа
Как я могу написать последовательность и триггер, который при вставке в таблицу проверяет, имеет ли атрибут 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;