删除级联不适用于sqlite

问题描述 投票:1回答:1
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表中。我究竟做错了什么?很感激帮助。谢谢。

database sqlite cascade
1个回答
2
投票

保留删除级联的外键的行将在删除保存主键的行时自行删除。如果删除包含外键的行,则不会删除包含主键的行。这是故意的。

据我所知,你有一对一或一对多的关系,某个职位可以让一个或多个员工在其下工作,每个员工只有一个职称。

如果它是一对一的关系,您只需删除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;
© www.soinside.com 2019 - 2024. All rights reserved.