【问题标题】:SQL Delete issue with foreign keySQL删除外键问题
【发布时间】:2013-01-02 13:03:44
【问题描述】:

我有一个与外键有关的问题。我正在使用 SQL Server 2008。

有 2 个表,Customer 和 Invoice,它们看起来像这样:

客户表:
客户ID
名称
地址

发票表:
发票ID
日期
客户编号

Customer 表中的 CustomerID 列是主键,Invoice 表中的 CustomerID 列有一个外键。

我想删除 Customer 表中的一行,但删除 Invoice 表中的关联行。有没有办法做到这一点?

编辑:
我忘了提到删除的客户存储在日志表中,所以 ID 仍然存在,但在不同的表中

【问题讨论】:

  • 您想故意制造数据完整性问题吗?当该客户离开时,customerID 53 在发票表中的含义是什么?
  • 在删除时,您应该能够将 FK 值级联为 null。
  • 只需将客户标记为非活动。你仍然需要记录。

标签: sql sql-server-2008 foreign-keys


【解决方案1】:

"我想删除 Customer 表中的一行,但不删除 发票表中的连接行。”

外键的全部和全部目的是防止您这样做。

约束强制执行规定发票必须属于客户的规则。那么,如果发票不属于客户,这在您的应用程序中意味着什么?它应该属于什么?

或者用商业术语来说,如果发票没有客户谁来支付?


当然,我的咆哮假设Invoice.CustomnerID 是必填列。也许您的数据模型允许它是可选的。在这种情况下,将列设置为 NULL,然后您可以删除客户记录。鉴于基本的业务规则 - 必须支付发票(或公司破产),我认为这将是一个有缺陷的数据模型,但是嘿!

【讨论】:

  • 除此之外(很可能是因为),在 ERP 系统中禁用标记客户表条目很常见(这意味着客户不再处于活动状态,仅出于历史原因保留在数据库中)
  • 你是对的,但我忘了提到被删除的客户被存储在日志表中,所以 ID 仍然存在,但在不同的表中,是否有其他解决方案?
  • @Marc - 为什么使用单独的表而不是 is_deleted 标志或 deleted_date?您可以有一个视图,按此过滤以仅显示活跃客户。
  • 好的,我会坚持使用 is_deleted 标志,谢谢大家!
【解决方案2】:

Adjust your FK constraint from SQL Management Studio like here.. The Highlighted Delete Rule outlines what sort of enforcement you want to imply on the related table record, the approprite option I see can be Set Default or Set Null in the dropdown.请考虑所附图片。

【讨论】:

    猜你喜欢
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2019-07-09
    • 1970-01-01
    相关资源
    最近更新 更多