如何在链接表中永久删除记录?
比方说,我有这2个表QuesType和疑问句: -如何在链接表中永久删除记录?
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处于非活动状态。 由于与Ques表具有外键关系,我无法永久删除QuesType。所以,我只设置 列Active = false,然后这些Questypes在绑定时不会显示在我的网格上。
我想要做的是能够永久删除任何QuesType。现在它只能被删除,如果它没有在Ques表中的任何地方使用 ,对吧?
所以要永久删除任何QuesType我认为这是我能做什么: -
在显示QuesTypes网格,我有主动此复选框并delete.What一个按钮,我认为是,当用户 使某些QuesType处于非活动状态,然后OnCheckChanged()事件将运行,并且该代码将删除正在使用该QuesTypeID的Ques表中的所有问题 。然后在QuesType网格上,QuesType将显示为“已禁用”,并且只有用户可以永久删除它。
我是否正确思考?
目前在我的DeleteQuesType存储过程是什么我做的是: -
设置激活=假, 设置QuesTye =一些字符串如XXInactiveXX
有没有其他办法?
编辑 如果我只想实现这种方式,比如先让用户停用QuesType,并且只有在用户可以永久删除它时停用。那是正确的逻辑吗?
我认为你需要做的就是把
ON DELETE CASCADE
条款上您的外键约束。当相应的QuesType行被删除时,这将自动从您的Ques表中删除行。
您只能删除已停用的QuesTypes
。
在删除QuesType
之前,您必须先查询数据库,看看是否为QuesType.Active = false
。如果是,则可以删除子表中引用QuesType.Id
(这称为级联删除)的所有行。您还可以在子行中的QuesTypeID列上设置空值。
阅读this book online了解ON DELETE CASCADE | SET NULL子句。这个条款将使你能够做你想做的事。
恩,但是如果我只想实现这种方式,比如先让用户停用QuesType,并且仅在用户可以永久删除它时停用。那是正确的逻辑吗? – Serenity 2011-01-05 20:00:20
您已经有了一个活动列,只需在删除之前查询它以确保它为假。您可以使用触发器自动执行此操作,但如果您是初学者,那么我可能会建议您不要这样做。 – BG100 2011-01-05 20:11:22