2017-10-15 42 views
0

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),在此关系其他元组不会被删除。我是这样想的。

但书的答案是所有的元组都被删除。我不明白为什么所有的元组都被删除。

+0

将employee_name添加到外键约束:外键(manager_name)在删除级联时引用manager(employee_name) –

+0

DDL在书中。问题是如果一个关系中的元组被删除,会发生什么 – Damotorie

+0

您的代码无效。对于外键,您需要指定它所引用的列,它目前只指定它引用的表。如果它引用主键,那么你是对的,它不会删除每一行。但是你应该避免检查你所要做的是本书告诉你要做什么。也许有另一个外键,一个不同的外键,不同的样本数据,或者你应该删除一个不同于((A,B))的元组来获得这个效果。 – Solarflare

回答

0

您有作为员工的A,B,C和D。其中您已定义B和C为经理。并且您已选择使用ON DELETE CASCADE,这意味着如果您在表Manager中删除一个父元组,它将自动影响子元素(表Employees)。

基本上,如果你决定要删除既是管理者(B和C) - B的A,C和d为员工和C有B中员工)。

在这种情况下,所有元组可能会在创建表时定义的级联中删除。