插入后增加新列

时间:2019-04-26 22:03:50

标签: oracle database-trigger

我对所有人都有一个问题。我对SQL还是很陌生,搜索了两个多小时,却找不到我真正需要的东西。

我在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 个答案:

答案 0 :(得分:2)

无需使用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;

在DML语句之后当然需要一个commit,我认为在commit表上应用INSERT语句之后,最好在此触发器之外仅包含一个Courses ,因为提供了交易完整性规则。

P.S。我知道您被限制使用触发器,但是如@nikhil sugandh所建议的,对列frequency的值使用序列是更好,更实用的选择。在这种情况下,不需要触发器。如果您使用的是数据库版本12c,则可以在创建表的过程中将列frequency的默认序列添加为frequency INTEGER GENERATED ALWAYS AS IDENTITY

答案 1 :(得分:0)

使用顺序:

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