【问题标题】:How to delete records permanently in case of linked tables?在链接表的情况下如何永久删除记录?
【发布时间】:2011-01-05 19:50:42
【问题描述】:

假设我有这 2 个表 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 是主键

在查询表中:- 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 将显示为 Deactivated 并且仅 那么用户可以永久删除它。

我的想法正确吗?

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

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

还有其他方法吗?

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

【问题讨论】:

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


    【解决方案1】:

    我认为你需要做的是把

    ON DELETE CASCADE
    

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

    【讨论】:

    • 嗯好吧,但如果我只想实现这种方式,比如首先让用户停用 QuesType,并且只有当它被停用时,用户才能永久删除它。这是正确的逻辑吗?
    • 您已经有一个活动列,只需在删除前查询它以确保它是错误的。您可以使用触发器自动执行此操作,但如果您是初学者,那么我可能会建议您不要这样做。
    【解决方案2】:

    您只能删除已停用的QuesTypes

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

    阅读this book online 以了解 ON DELETE CASCADE | SET NULL 子句。这个子句可以让你做你想做的事。

    【讨论】:

      猜你喜欢
      • 2012-11-22
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 2014-03-01
      • 2020-12-26
      • 1970-01-01
      • 2022-01-20
      • 2011-04-06
      相关资源
      最近更新 更多