0

我有这样的表结构:

PrimaryTable->p_id 这里 p_id 是主要的

SecondoryTable->s_id p_id 这里 p_id 是一个外键

ThirdTable->t_id s_id 这里 s_id 是外键

FourthTable->f_id t_id 这里 t_id 是外键

所以我正在删除我p_id的一个,PrimaryTable并希望它的SecondoryTable数据也ThirdTable应该被删除SecondoryTable并且数据应该被删除并且FourthTable数据应该被参考删除ThirdTable

我知道我可以Delete从下到上编写查询,但是对于像这样的这么多级别怎么办?

我发现了这一点,但不确定如何操作:https ://stackoverflow.com/a/9847308/1182021

因为它的四级层次结构我很困惑。

编辑1:

如果我想Primary在 Delete ofChild

请建议。

4

3 回答 3

1

根据 OP 的要求,这是当从子表中删除行时用户想要从父表中删除行的情况的答案。删除父级时递归删除所有子级的情况正在使用 MySQL ON DELETE CASCADE 选项。

这 4 个表是表 1、表 2、表 3 和表 4。

如果用户想要删除 table2 中的一行以及 table1 中的相应行(table2 的父级),那么在 PHP 中:

// t2_delete_row_id is the id of the table 2 row to be deleted
// get the the parent of table2
$sql_get_parent = "select p_id from table2 where s_id = 't2_delete_row_id '";
// execute this query using MySQLi/PDO to get id of the parent row to be deleted
// assuming that id is t1_parent_row_id
// now delete the row from table 2:
// note that because of the foreign key constraints, 
// corresponding rows from table3 and table4 would also be deleted
$sql_delete_child = "delete from table2 where s_id = 't2_delete_row_id'";
if (mysqli_query($sql_delete_child)){
    // delete the parent row
    $sql_delete_parent = "delete from table1 where p_id = 't1_parent_row_id'";
}

可以扩展此逻辑,以便在删除 table3 行时,相应的 parent(table2) 和 "grand-parent" (table1) 行也将被删除。这种情况可能需要一些递归。由于外键约束,这当然会删除 table4 中的子行。

于 2013-07-26T19:42:37.660 回答
0

如果您不能使用 FOREIGN KEYS(即使用 MyISAM 表),我会为此创建一个 TRIGGER。下面的第一个示例...您需要为每个级联表制作一个。

DELIMITER //
CREATE TRIGGER `pDeleteTrigger` BEFORE DELETE ON `PrimaryTable`
 FOR EACH ROW BEGIN
    DELETE FROM `SecondoryTable` WHERE NEW.`p_id` = `SecondoryTable`.`p_id`
END
//
DELIMITER ;
于 2013-07-26T18:43:25.673 回答
0

我有两种方法(如果你的语言是 Tsql)

1.- 存储过程

这个想法是有一个过程“spDelete_PrimaryTable”,这样你就可以通过在 tsql 中写一些东西来删除四个表中的寄存器,比如:

 exec spDelete_PrimaryTable
       @p_id= 25 /* (25 or watever p_id of primary table you want to delete)*/

(是的,您可以从 vb.net 或您想要的任何地方调用它。)

代码将类似于:

use [your_database]

CREATE PROCEDURE [dbo].[spDelete_PrimaryTable]
    @p_id nvarchar(MAX)
AS 
 begin  
    SET NOCOUNT ON;

delete from FourthTable where t_id in (
    select ThirdTable.t_id 
    from ThirdTable inner join SecondoryTable on ThirdTable.s_id = SecondoryTable.s_id
    where SecondoryTable.p_id = @p_id
)
go

delete from ThirdTable where s_id in (
    select SecondoryTable.s_id 
    where SecondoryTable.p_id = @p_id
)
go

    /*Lol, I forgot to eliminate from the "SecondoryTable" */
    delete from SecondoryTable.s_id 
    where SecondoryTable.p_id = @p_id

go

delete from PrimaryTable where p_id = @p_id
go

 END


GO

2.- 触发器

似乎“克里斯托弗·莫里西”已经发布了,而我正在编辑这个答案 XP

于 2013-07-26T18:59:12.007 回答