如何删除“子”记录?

时间:2014-11-02 23:31:44

标签: sql

对于模糊的标题感到抱歉,我不确定如何定义我想要做的事情。

我有3张桌子: 类别 - 具有唯一ID(cat_id) 问题 - 具有唯一ID和类别外键(ques_category_fk) 答案 - 有一个唯一的ID和一个问题外键(ans_question_fk)

我要做的是删除单个类别下的所有问题和答案。删除问题没问题。但是,我不确定如何使用相同的SQL语句删除答案。

我想到加载所有问题,迭代它们或在答案中添加类别外键。这两个似乎效率低下。

这是我当前的删除声明:

DELETE FROM questions WHERE ques_category_fk = @fk

2 个答案:

答案 0 :(得分:1)

更容易编写和维护解决方案将在一个事务中分别运行这些查询,删除答案和问题,然后提交它。通过这种方式,您可以确保将它们全部删除(如果查询失败,则不会删除),并且您不必诉诸冗长且令人困惑的查询。

要把它放在一些模拟示例中,让我们说你要删除一个问题和后续的答案,id = 6(在我的例子中,idquestion是表格问题中的pkey,并且是表格中f_key的名称答复):

start transaction;
delete from answers where idquestions = 6;
delete from questions where idquestions = 6;
commit;

然后,如果你想删除很多问题,首先运行一个查询来选择你要删除的所有问题id并迭代它们 - 为每个id运行上面的查询集。

答案 1 :(得分:0)

创建“子”表以从引用的“父”表中级联删除。像这样:

CREATE TABLE answers (
    id SERIAL,
    question_id int REFERENCES questions(id) ON DELETE CASCADE,
    ...
);

现在,删除问题记录也会删除引用的答案记录。

相关问题