Увеличивать новый столбец после вставки - PullRequest
0 голосов
/ 27 апреля 2019

У меня есть вопрос ко всем вам. Я довольно новичок в SQL, искал более 2 часов и не нашел именно то, что мне нужно.

У меня есть таблица в SQL с именем Courses. Вот конструктор:

CREATE TABLE Courses
(sign     VARCHAR2(6)   NOT NULL,
title     VARCHAR(50)   NOT NULL,
credits   INTEGER       NOT NULL,
CONSTRAINT  PrimaryKeyCourses  PRIMARY KEY (sign)
);

Я должен добавить новый столбец, который я сделал с:

ALTER TABLE Courses ADD frequency INTEGER;

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

Я пытался сделать это:

CREATE TRIGGER fq
AFTER INSERT ON Courses
FOR EACH ROW
UPDATE frequency SET frequency = frequency + 1;

Но, похоже, он не работает должным образом :( Я не знаю, что делать.

Ответы [ 2 ]

2 голосов
/ 27 апреля 2019

Нет необходимости использовать оператор UPDATE, используйте оператор SELECT с max(value)+1. И чтобы иметь возможность изменить значение :new., необходимо преобразовать триггер в тип BEFORE.

Итак, вы можете использовать тот, что ниже

CREATE OR REPLACE TRIGGER fq
BEFORE INSERT ON Courses
FOR EACH ROW
DECLARE
BEGIN
    select nvl(max(frequency),0)+1
      into :new.frequency
      from Courses;
END;

Конечно, вам нужно commit после оператора DML, я думаю, что лучше включить только один commit вне этого триггера после оператора INSERT, примененного к таблице Courses, из-за обеспечения правила целостности транзакции.

P.S. Я знаю, что вы ограничены в использовании триггера, но использование последовательности для значения столбца frequency - лучшая, практичная альтернатива, как предложил @nikhil sugandh. В этом случае триггер не нужен. Если вы используете DB версии 12c, вы можете добавить эту последовательность по умолчанию для столбца frequency как frequency INTEGER GENERATED ALWAYS AS IDENTITY во время создания таблицы.

0 голосов
/ 27 апреля 2019

используйте последовательность:

  CREATE SEQUENCE Courses_frequency
  MINVALUE 1
  MAXVALUE 999999999999999999999999999
  START WITH 1
  INCREMENT BY 1
  CACHE 20;

и вставьте как:

INSERT INTO Courses 
(sign,title,credits,frequency)
VALUES
(value1,value2,value3,Courses_frequency.NEXTVAL);
...