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表中。我究竟做错了什么?很感激帮助。谢谢。
答案 0 :(得分: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;