我有两张桌子:
CREATE TABLE IF NOT EXISTS Service (
id_ser integer PRIMARY KEY,
description char(256),
id_emp integer NOT NULL,
FOREIGN KEY (id_emp) REFERENCES Employee(id_emp));
CREATE TABLE IF NOT EXISTS Employee (
id_emp integer PRIMARY KEY,
name char(50),
active boolean);
每位员工都有一个bool专栏,说明他是否有效。
每当我想向服务添加另一行时(通过插入),我想强制只接受 True 处于活动状态的员工。
我不知道怎么能这样做。如果通过检查或通过触发器。
答案 0 :(得分:2)
如果员工不活跃,您希望使用带有SELECT RAISE
错误的before触发器,如下所示:
CREATE TRIGGER IF NOT EXISTS I_Service_Active
BEFORE INSERT ON Service
BEGIN
SELECT RAISE(FAIL, 'Cannot insert Service record since Employee is not active')
FROM Employee E
WHERE E.id_emp = NEW.id_emp
AND NOT E.active;
END;
您不能对约束执行相同的操作,因为这需要在约束表达式中不允许的子查询。
测试数据的完整示例:
CREATE TABLE IF NOT EXISTS Employee (
id_emp integer PRIMARY KEY,
name char(50),
active boolean);
CREATE TABLE IF NOT EXISTS Service (
id_ser integer PRIMARY KEY,
description char(256),
id_emp integer NOT NULL,
FOREIGN KEY (id_emp) REFERENCES Employee(id_emp));
CREATE TRIGGER IF NOT EXISTS I_Service_Active
BEFORE INSERT ON Service
BEGIN
SELECT RAISE(FAIL, 'Cannot insert Service record since Employee is not active')
FROM Employee E
WHERE E.id_emp = NEW.id_emp
AND NOT E.active;
END;
INSERT INTO Employee (id_emp, name, active)
VALUES (1, 'Sam', 1);
INSERT INTO Employee (id_emp, name, active)
VALUES (2, 'John', 0);
-- SUCCEEDS
INSERT INTO Service (id_ser, description, id_emp)
VALUES (1, 'Sam Service', 1);
-- FAILS
INSERT INTO Service (id_ser, description, id_emp)
VALUES (2, 'John Service', 2);