我正在尝试为代表学校的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;
有谁能帮我弄清楚我做错了什么? 谢谢!
答案 0 :(得分:27)
见trigger documentation;您只能在触发器中使用SELECT
,INSERT
,UPDATE
和DELETE
语句。
要引发错误,请使用RAISE
:
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;
(您还需要检查UPDATE
s。)
答案 1 :(得分:0)
一种简单的方法是,如果存在任何主体,您可以先检查数据库,然后执行必要的操作
为这种微不足道的任务编写触发器是一种过度杀伤