如何在链接表的情况下永久删除记录?

时间:2011-01-05 19:50:43

标签: c# asp.net sql-server sql-delete relationships

假设我有这两个表QuesType和Ques: -

QuesType

QuestypeID|QuesType      |Active
------------------------------------
101       |QuesType1     |True
102       |QuesType2     |True
103       |XXInActiveXX  |False



Ques

QuesID|Ques|Answer|QUesTypeID|Active
------------------------------------
1     |Ques1|Ans1 |101     |True
2     |Ques2|Ans2 |102     |True
3     |Ques3|Ans3 |101     |True

在QuesType表中: - QuesTypeID是主键

在Ques Table中: - QuesID是主键,QuesType ID是从QuesType表

引用QuesTypeID的外键

现在我无法从QuesType表中删除记录,我只能通过设置Active = False使QuesType处于非活动状态。 由于与Ques Table的外键关系,我无法永久删除QuesTypes。所以,我只是设置了 列Active = false,然后这些Questypes在绑定时不会显示在我的网格上。

我想要做的是能够永久删除任何QuesType。现在只有在任何地方都没有使用它时才能将其删除 在Ques表中,对吧?

所以要永久删除任何QuesType,我认为这就是我能做的: -

在显示QuesTypes的网格中,我有一个Active的复选框和一个用于删除的按钮。我想是什么,当用户 使一些QuesType处于非活动状态,然后OnCheckChanged()事件将运行,并且将有代码删除所有问题 在Ques表中使用该QuesTypeID。然后在QuesType网格上,该QuesType将显示为Deactivated并且仅显示 然后用户可以永久删除它。

我是否正确思考?

目前在我的DeleteQuesType存储过程中,我正在做的是: -

设置Active = false和 设置QuesTye =某些字符串,如XXInactiveXX

还有其他办法吗?

修改 如果我只想以这种方式实现,比如首先让用户停用QuesType,并且只有在停用了用户可以永久删除它的情况下该怎么办?这是正确的逻辑吗?

2 个答案:

答案 0 :(得分:2)

我认为你需要做的是把

ON DELETE CASCADE
外键约束的

子句。当删除相应的QuesType行时,这将自动删除Ques表中的行。

答案 1 :(得分:1)

您只能删除已停用的QuesTypes

在删除QuesType之前,您必须查询数据库并查看是否QuesType.Active = false。如果是,您可以删除子表中引用QuesType.Id的所有行(这称为级联删除)。您还可以在子行中的QuesTypeID列上设置空值。

阅读this book online以了解ON DELETE CASCADE | SET NULL子句。该条款将使您能够做您想做的事。