从SQL DB添加和/或删除记录

时间:2014-03-31 16:01:18

标签: php mysql sql

大家好,我的情况是网站上有一个可选择的项目列表,其中每个所选项目都在mySQL表中有记录:

parentID BIGINT NOT NULL
childID BIGINT NOT NULL

' parentID'是' childID'的记录的ID。属于,所以DB可能包含类似的内容:

2 | 13
4 | 8
4 | 10
4 | 7

这表明#4记录有三条与之相关的记录(7,8,10)。现在让我们说用户选择网站列表中的另一个项目(例如记录9),但也取消选择记录7,在添加记录9时从列表中删除记录7的最佳做法是什么?我已经看过使用' NOT IN'陈述(没有成功)和' NOT EXIST'陈述(但没有实施),但我想在此之前先问这个问题,然后花太多时间做一些比我自己设计好得多的事情。

戴夫

1 个答案:

答案 0 :(得分:0)

可以编写应用程序逻辑来检测何时删除行而另一行被添加,并将其与UPDATE查询一起用于将“已删除”行修改为“已添加”行。但坦率地说,这是其中一种情况,其中明显的优化被复杂性所掩盖(如果两行被删除但只有一行被添加会发生什么?反之亦然?),结果将是一场难以维持的噩梦。

相反,我建议两次传递 - 一次是删除记录,另一次是插入新的。

您的DELETE查询可能如下所示:DELETE FROM tableName WHERE parentID=4 AND childID NOT IN (8,10,9),其中8,10和9是您的表单传递到您的应用的记录ID。你会注意到childID 9在查询中,但不在数据库中;这很好,它不会造成任何伤害,只是将所有传递的ID粘合到一个查询中这一事实的副作用是最简单的选择。 (请注意,这只是一个选项;另一个选项是首先选择现有的childID,然后将其与表单中的传入ID列表进行比较,只删除已删除的ID。)

然后,您的INSERT传递将遍历表单中的传入ID,并插入不在数据库中的ID。这可能需要首先查找SELECT,然后将其与传入的ID进行比较,以找到数据库中尚未存在的ID。我不会进一步讨论这个问题,因为看起来你已经有了添加行的逻辑功能;如果情况并非如此,我可以进一步详细说明。

在任何一种情况下,绝对肯定您正在清理输入以防止SQL注入!有关该主题的更多信息,请参阅this question和答案。