删除级联不适用于 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;
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;