插入后增加新列
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)+1
的 SELECT
语句。为了能够更改 :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
。
我有一个问题要问大家。我刚接触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)+1
的 SELECT
语句。为了能够更改 :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
。