对约束的一些怀疑

时间:2013-05-26 15:36:32

标签: sqlite

我有两张桌子:

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 处于活动状态的员工。

我不知道怎么能这样做。如果通过检查或通过触发器。

1 个答案:

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