针对相同目标表/列创建两个级联外键

时间:2010-04-01 14:24:53

标签: tsql database-design triggers foreign-keys

我有以下表格:

 user (userid int [pk], name varchar(50))
 action (actionid int [pk], description nvarchar(50))

被另一个捕获关系的表引用:

<user1> <action>'s <user2>.

我用下表做了这个:

userAction (userActionId int [pk], actionid int [fk: action.actionid], **userId1 int [fk ref's user.userid; on del/update cascade],  userId2 int [fk ref's user.userid; on del/update cascade]**).

但是,当我尝试保存userAction表时,我收到一个错误,因为我对user.userid有两个级联的fk。

有没有办法解决这个问题,还是我必须使用触发器?

1 个答案:

答案 0 :(得分:0)

您可以使用触发器,但我认为实际编写删除更好。如果删除大量记录并且我们不允许删除它们,则级联删除通常会导致性能不佳。您不能将它们用于应用程序一次只删除一条记录的事实。如果那条记录有数千条儿童记录怎么办?如果它有数百万呢?通过触发器级联删除或删除其他表是极其危险的行为。最好将删除的代码写成你想要的,如果有太多的子记录,甚至可以进行批处理。此外,存在子记录的事实通常是您不应该删除父记录的共鸣。例如,假设客户端A不再是活动客户端。但他过去已经从你那里买了数百万美元的东西。你真的想通过删除一百万旧订单搞乱会计记录吗?也许将记录标记为不活动是一个更好的选择。