14

我正在尝试为代表学校的 sqlite 数据库创建触发器。我有一个名为 Administrators 的表,其架构如下:

CREATE TABLE Administrators(
ssn INT CHECK(ssn > 100000000),
lName CHAR(20),
fName CHAR(10),
gender CHAR(1) CHECK(gender IN('F','M')),
dob DATE,
address CHAR(100),
phone INT CHECK(phone > 1000000000),
role CHAR(20) CHECK(role IN('Principal','Vice Principal','Dean')),
PRIMARY KEY(ssn)
);

我想确保只有一位校长。我已经尝试了所有我能想到的方法,并且在触发器的各个位置不断出现错误。我试过的最后一个说“IF”附近有一个错误

sqlite> CREATE TRIGGER onePres
   ...> BEFORE INSERT ON Administrators
   ...> BEGIN
   ...> IF (EXISTS (SELECT * FROM Administration WHERE role = 'Principal'))
   ...> BEGIN
   ...> ROLLBACK TRANSACTION;
   ...> RETURN
   ...> END;
   ...> END;

谁能帮我弄清楚我做错了什么?谢谢!

4

2 回答 2

27

请参阅触发器文档;您只能在触发器中使用SELECTINSERTUPDATEDELETE语句。

要引发错误,请使用RAISEa 内部的函数SELECT

CREATE TRIGGER onePres
BEFORE INSERT ON Administrators
FOR EACH ROW
WHEN NEW.role = 'Principal'
BEGIN
    SELECT RAISE(ABORT, 'There can be only one.')
    WHERE EXISTS (SELECT 1
                  FROM Administrators
                  WHERE role = 'Principal');
END;

(您还需要检查UPDATEs。)

于 2013-04-13T08:27:15.277 回答
0

一种简单的方法是,如果存在任何作为主体的人,您可以首先检查数据库,然后执行必要的操作

为这种微不足道的任务编写触发器是一种矫枉过正

于 2013-12-19T21:14:51.533 回答