2011-01-05 110 views
1

比方说,我有这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,并且只有在用户可以永久删除它时停用。那是正确的逻辑吗?

回答

2

我认为你需要做的就是把

ON DELETE CASCADE 

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

+0

恩,但是如果我只想实现这种方式,比如先让用户停用QuesType,并且仅在用户可以永久删除它时停用。那是正确的逻辑吗? – Serenity 2011-01-05 20:00:20

+0

您已经有了一个活动列,只需在删除之前查询它以确保它为假。您可以使用触发器自动执行此操作,但如果您是初学者,那么我可能会建议您不要这样做。 – BG100 2011-01-05 20:11:22

1

您只能删除已停用的QuesTypes

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

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