我对所有人都有一个问题。我对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;
但是它似乎不能正常工作:(我不知道该怎么办。
答案 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);