插入后增加新列

Increment new column after insert

我有一个问题要问大家。我刚接触SQL,找了2个多小时也没找到我需要的。

我在 SQL 中有一门名为 table 的课程。这是构造函数:

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;

但它似乎不能正常工作:(我不知道该怎么做。

使用序列:

  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);

无需使用 UPDATE 语句,使用带有 max(value)+1SELECT 语句。为了能够更改 :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 语句之后,我认为最好在 INSERT 语句应用于 [=19= 之后在此触发器之外只包含一个 commit ] table,因为提供了交易完整性规则。

P.S。我知道您只能使用触发器,但是使用序列作为列 frequency 的值是更好、更实用的替代方法,正如@nikhil sugandh 所建议的那样。在这种情况下,不需要触发器。如果您使用的是数据库版本 12c,则可以在 table 创建期间将该序列作为列 frequency 的默认值添加为 frequency INTEGER GENERATED ALWAYS AS IDENTITY