1

假设我有这两个表 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 表中:- QuesID 是主键,QuesType ID 是从 QuesType 表中引用 QuesTypeID 的外键

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

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

因此,要永久删除任何 QuesType,我认为这是我可以做的:-

在显示 QuesTypes 的网格中,我有一个用于活动的复选框和一个用于删除的按钮。我的想法是,当用户使某些 QuesType 处于非活动状态时,OnCheckChanged() 事件将运行,并且将具有删除所有问题的代码在使用该 QuesTypeID 的 Ques 表中。然后在 QuesType 网格上,该 QuesType 将显示为已停用,然后用户才能将其永久删除。

我的想法正确吗?

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

设置 Active=false 并设置 QuesTye= 一些字符串,如 XXInactiveXX

还有其他方法吗?

编辑如果我只想以这种方式实现怎么办,比如首先让用户停用 QuesType,并且只有当它被停用时,用户才能永久删除它。这是正确的逻辑吗?

4

2 回答 2

2

我认为你需要做的是把

ON DELETE CASCADE

关于外键约束的子句。当相应的 QuesType 行被删除时,这将自动从您的 Ques 表中删除行。

于 2011-01-05T19:54:34.543 回答
1

您只能删除已QuesTypes停用的。

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

在线阅读本书以了解 ON DELETE CASCADE | SET NULL 子句。该条款将使您能够做您想做的事。

于 2011-01-05T19:57:02.990 回答