删除级联不适用于 sqlite

Delete cascade doesn't work for sqlite

CREATE TABLE employees (
    id         INTEGER      PRIMARY KEY AUTOINCREMENT
                            NOT NULL,
    emp_id     TEXT         REFERENCES title_emp (emp_id) ON DELETE CASCADE
                                                          ON UPDATE CASCADE
                                                          MATCH [FULL],
    birth_date DATE,
    first_name VARCHAR (14),
    last_name  VARCHAR (16),
    gender     VARCHAR (6),
    hire_date  DATE,
    mobile     TEXT,
    telephone  TEXT,
    address    TEXT
);

CREATE TABLE title_emp (
    emp_id    TEXT         PRIMARY KEY,
    title     VARCHAR (50),
    from_date DATE,
    to_date   DATE
);

我希望这样,如果删除了某个特定员工,则 title_emp 之后与该员工相关的所有内容都将被删除。 DELETE CASCADE 似乎不起作用。当我删除一名员工时,该员工的头衔保留在 title_emp table 中。我究竟做错了什么?非常感谢您的帮助。谢谢。

当包含主键的行被删除时,包含外键并启用删除级联的行将删除它们自己。如果删除包含外键的行,则不会删除包含主键的行。这是故意的。

据我了解,您拥有一对一或一对多的关系,其中某个头衔可以有一名或多名员工在其下工作,而每个员工只有一个头衔。

如果是一对一的关系,可以直接删除主键在title_emp中的行。任何具有指向该主键的外键的员工也将被删除(如果您启用了外键。)

您可以使用

启用外键
PRAGMA foreign_keys = ON;

如果您想删除一个头衔和在该头衔下工作的所有员工,同样的过程也适用于一对多关系。

如果它是一对多的关系,并且您希望在没有员工在该职位下工作时删除该职位,则级联删除是不够的。您将需要改用触发器。

如果最后一位在该职位下工作的员工被删除,则以下触发器将删除该职位。

CREATE TRIGGER delete_unused_title
  AFTER
  DELETE ON
  employees
  BEGIN
    DELETE FROM title_emp WHERE emp_id = OLD.emp_id
    AND (SELECT COUNT(*) FROM employees WHERE emp_id = OLD.emp_id) = 0;
  END;