SQL参考integerity递归
问题描述:
DDL用于创建数据库是这样SQL参考integerity递归
create table manager
(employee_name varchar(20) not null,
manager_name varchar(20) not null,
primary key (employee_name),
foreign key (manager_name) references manager on delete cascade);
如果经理关系的情况下是这样的
employee_name | manager_name
-----------------------------
A | B
-----------------------------
B | C
-----------------------------
C | B
-----------------------------
D | B
在这种情况下,如果我删除元组(A,B),在此关系其他元组不会被删除。我是这样想的。
但书的答案是所有的元组都被删除。我不明白为什么所有的元组都被删除。
答
您有作为员工的A,B,C和D。其中您已定义B和C为经理。并且您已选择使用ON DELETE CASCADE
,这意味着如果您在表Manager中删除一个父元组,它将自动影响子元素(表Employees)。
基本上,如果你决定要删除既是管理者(B和C) - B的A,C和d为员工和C有B中员工)。
在这种情况下,所有元组可能会在创建表时定义的级联中删除。
将employee_name添加到外键约束:外键(manager_name)在删除级联时引用manager(employee_name) –
DDL在书中。问题是如果一个关系中的元组被删除,会发生什么 – Damotorie
您的代码无效。对于外键,您需要指定它所引用的列,它目前只指定它引用的表。如果它引用主键,那么你是对的,它不会删除每一行。但是你应该避免检查你所要做的是本书告诉你要做什么。也许有另一个外键,一个不同的外键,不同的样本数据,或者你应该删除一个不同于((A,B))的元组来获得这个效果。 – Solarflare