gpt4 book ai didi

database - 删除级联不适用于 sqlite

转载 作者:搜寻专家 更新时间:2023-10-30 22:28:33 24 4
gpt4 key购买 nike

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 表中。我究竟做错了什么?非常感谢您的帮助。谢谢。

最佳答案

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

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

如果是一对一的关系,可以简单的删除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;

关于database - 删除级联不适用于 sqlite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47907825/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com