如何使用其他表中的外键删除带主键的行?

时间:2013-08-22 13:14:37

标签: php mysql foreign-keys sql-delete

我有一张名为'agenda'的表//翻译:dairy

包含以下行:

idagenda // primary key
title
waar
organisatie
...
etc.
...

我还有一个日历项目/事件日期表名为agendadatum

包含以下行:

id // primary key
idagenda // id from other table
van //from
tot // till
datum // date

当字段'tot'是今天的日期时,它将从数据库中删除行,但'agenda'表中的行保持不变。它们没有被删除,因为我没有给它们打电话。

我的删除查询如下所示:

DELETE FROM agendadatum WHERE tot < NOW(); 

如何从'agenda'表中删除与agendadatum中的外键具有相同ID的行?

3 个答案:

答案 0 :(得分:0)

在您的create table中,您需要提及外键约束,如

FOREIGN KEY (product_id) REFERENCES products (id)
       ON DELETE CASCADE
       ON UPDATE CASCADE,

之后如果您运行删除查询,将自动删除行,这将引用表的ID

您可以查看delete on cascade

中的说明

答案 1 :(得分:0)

如果您使用的是php,可以尝试以下

//get all agentadatum data with date now and before
$select_agendadatum = mysql_query("SELECT * FROM agendadatum WHERE tot <= NOW()") or die (mysql_error());
//loop through rows
while($row_agendadatum = mysql_fetch_assoc($select_agendadatum))
{
     //delete agendadatum row
     $delete_agendadatum = mysql_query("DELETE FROM agendadatum WHERE id = '".$row_agendadatum['id']."'") or die (mysql_error());
    //delete agenda row
    $delete_agenda= mysql_query("DELETE FROM agenda WHERE idagenda = '".$row_agendadatum['idagenda']."'") or die (mysql_error());
}

如果您的逻辑接受每个agenta多个agendadatum,您可以在删除agenta之前计算特定agenta中是否有超过1个agendadatum ...

希望这会有所帮助

答案 2 :(得分:0)

您可以在一个查询中删除多个表:

DELETE agenda.*, agendadatum.*
FROM agenda
JOIN agendadatum USING (idagenda)
WHERE tot < NOW();

这将删除agenda和agendadatum中的行,并且仅删除符合条件的行(如果您将DELETE替换为SELECT,则查询返回的行数相同。)