如何从多个表中删除

时间:2011-11-30 09:42:56

标签: php mysql

我有3张桌子:

  1. events。在这里,我有像 event_id, user_id, title, email, location, address, latitude, longitude, description, isapproved

  2. event_time。在这里我有领域 show_id, event_id, start_date, start_time, end_date, duration, date, end_time

  3. categoryid, cat_id, event_id

  4. 我正在将数据插入3个表中,以便在event_id表中输入event 5事件时,相应的数据将填入event_title和{{1} }。 如果事件categoryevent_timestart_time2011-12-05,则填充end_date表格时,2011-12-07表格将填充3行,例如同一事件id和不同的日期:

    event_time

    将根据输入show_id event_id start_date start_time end_date duration date end_time 11 5 2011-12-05 12:00:00 2011-12-07 03:00:00 2011-12-07 15:00:00 10 5 2011-12-05 12:00:00 2011-12-07 03:00:00 2011-12-06 15:00:00 9 5 2011-12-05 12:00:00 2011-12-07 03:00:00 2011-12-05 15:00:00 表格 在类别下拉列表中选择的类别数。

    category

    现在我想根据用户选择从数据库中删除事件。如果他想要删除特定日期的事件,那么只有在id cat_id event_id 25 3 5 24 5 5 中它才会被删除,事件类别应该在那里。 但是,如果用户想要删除不基于任何日期的事件,则应删除所有表中的数据。

    event_time

    这就是我编写的代码。 有谁知道怎么做?

2 个答案:

答案 0 :(得分:0)

总是发布SQL DDL和INSERT语句来解决这个问题。

目前尚不清楚是否只想从event_time或event_time和事件中删除行。

从event_time删除行很简单。

delete from event_time where event_id = (?)

从事件和event_time中删除行但从行中保留行的最简单方法是

  • 在event_time中使用外键约束,
  • 在该外键中使用ON DELETE CASCADE,
  • 在类别
  • 中的event_id上使用外键

执行此操作后,您只需从事件中删除一行,数据库引擎将删除event_time中的相关行。

delete from events where event_id = (?)

您需要使用INNODB引擎来强制执行外键约束。

说完这一切之后,在将event_id 5从所有其他表中删除后将其留在类别表中会很奇怪。

答案 1 :(得分:0)

您可能需要在代码中完成所有这些操作。如果数据库平台支持触发器,则可以使用触发器,还应该查看约束和级联选项。

例如,“on delete cascade”约束会自动处理删除事件的情况,因为它会为您删除event_time和类别中的相关记录。

最简单的解决方案是使用代码。因此,在您的应用中,确定需要清理的内容,并自行发出删除。

删除一个事件的所有时间和事件信息:

DELETE FROM event_time WHERE event_id = 5;
DELETE FROM event WHERE event_id = 5;
DELETE FROM category WHERE event_id = 5;

或者显然只删除时间:

DELETE FROM event_time WHERE show_id = 23;

你是否需要处理只有一次的情况,如果在这种情况下保留事件?这取决于你。