【问题标题】:Forbid delete if the record is referred from other tables如果记录是从其他表中引用的,则禁止删除
【发布时间】:2014-12-12 13:42:24
【问题描述】:

在 SQL Server 2008 中,如果在某些外键中从其他表中使用了所涉及的记录,我如何禁止删除(或抛出异常)?

我在关系中设置了“删除时 -> 什么都没有”,但这不是我需要的...我需要停止删除...

假设我有表books和表authors,并且在books中我有idAuthor,如果我至少有一本作者写的书,我怎么能禁止删除作者?

【问题讨论】:

  • 这应该是默认的。如果要自动删除该作者的所有书籍,则必须在 FK 关系中指定 cascade delete。您必须首先创建该关系。你保存了吗?
  • 是的,我不知道为什么,无论如何它都会删除...我的意思是,如果设置为删除 -> 什么都没有,它会删除不编辑书籍的作者...
  • 我不知道“删除-> 无”选项,你在哪里设置?您有以下选项: 1. 无操作 2. 级联 3. 设置 Null 4. 设置默认值。 “无操作”表示错误。

标签: sql-server foreign-keys


【解决方案1】:

对于 SQL Server,请使用 no action:

alter table ...
add foreign key
...
on delete no action

其他数据库使用restrict:

alter table ...
add foreign key
...
on delete restrict

在所有情况下,此选项都是默认选项,如果删除父行会违反约束,则会引发异常。

【讨论】:

    【解决方案2】:

    这在 SQL Server 中默认发生 - 不允许删除具有引用它的外键行(子项)的实体。因此,默认情况下,您应该在外键关系属性中将“强制外键约束”设置为 YES。

    此设置强制服务器在约束被破坏时抛出错误。

    partial source

    PS:我不知道您在 SQL Server 中在哪里设置“删除时 -> 无”。

    【讨论】:

    • 是的,“无操作”是您需要的,这是默认设置。如果这不能按预期工作,请将表定义添加到帖子中(从 SQL 中获取,我们还需要外键定义)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 2022-01-16
    相关资源
    最近更新 更多