【问题标题】:Set default or set null for foreign key in MS access在 MS 访问中为外键设置默认值或设置为空
【发布时间】:2013-01-20 10:37:20
【问题描述】:

我无法在 MS 访问中设置默认值或空值。例如,当我尝试删除父行时,受影响的子行的外键未设置为 NULL。我尝试在设计视图中将默认值设置为 NULL,但它似乎不起作用。

这是我的示例数据:
在员工表中:
ID | Name
1 | Tom
2 | Tim

在客户表中:
ID | Name | processed_By
1 | cust1 | 2

如果我要从员工表中删除 Tim,cust1 仍会在 processed_By 列中保留 2。但是,我希望它在从 staff_table 中删除 Tim 后执行以下操作。

ID | Name | processed_By
1 | cust1 | NULL

ID | Name | processed_By
1 | cust1 | 1

希望您能帮我解决这个问题。谢谢。

【问题讨论】:

  • 请添加更多细节,例如示例数据和/或不适合您的代码。
  • 嗨 Remou,我已经用示例数据更新了它。希望这会有所帮助

标签: ms-access ms-access-2007 ms-access-2010


【解决方案1】:

您可以在 MS Access 2010 中使用新的 data macros 轻松完成此操作

当表格在 MS Access 之外使用时,数据宏甚至可以工作。注意关键字Old,应用于创建删除后宏的Staff 表。 /* delete 行是一条评论,纯粹是为了说明。

【讨论】:

    【解决方案2】:

    我的印象是您正在寻找ON DELETE SET NULL。自 Jet 4 (Access 2000) 以来,Access 就支持该关系功能。但是,Access 用户界面中没有设置ON DELETE SET NULL 的规定。您必须通过 VBA 代码或在 SQL-92 模式下执行的 DDL 语句来执行此操作。

    我在立即窗口中执行了 DDL 语句。注意CurrentProject.Connection.Execute 是一种 ADO 方法,这意味着查询是以 SQL-92 模式执行的,而不是 Access 的默认 SQL-89 模式。

    strSql = "ALTER TABLE Customer" & vbCrLf & _
        "ADD CONSTRAINT processed_By_FK" & vbCrLf & _
        "FOREIGN KEY (processed_By) REFERENCES staff(ID)" & vbCrLf & _
        "ON DELETE SET NULL"
    CurrentProject.Connection.Execute strSql
    

    之后,我删除了 Timstaff 记录。该删除导致 cust1Customer.processed_By 值从 2 更改为 Null。

    如果这种方法听起来很有趣,您可以通过 Cascade to Null Relations 和来自 Stack Overflow 的这个 Stack Overflow 问题:MS Access set cascade-to-null constraint to existing table 找到 Allen Browne 的更多信息。 ON DELETE SET NULL 有几个“gotchas”。

    【讨论】:

    • 嗯,这似乎是一个相当合理的功能。你知道他们为什么要在用户界面上隐藏它吗?
    • 不完全是,但我怀疑隐藏它不是故意的选择......更有可能他们没有看到足够的价值在 UI 中公开它。我认为这类似于从未在 UI 中公开的其他 Jet 4 功能(例如检查约束)。
    • 如果您测试我提供的示例,您可能会在从staff 表中删除 Tim 时看到此消息:allenbrowne.com/graphics/CascadeDeleteDialog.gif 这对我来说似乎不对。我说支持ON DELETE SET NULL,但我没说支持好。 :-)
    【解决方案3】:

    我认为你做不到。您可以自动删除无效的子行,但没有内置函数将其设置回 null。

    如果你的设计真的需要这个,你只能通过 vba 来实现,但这只能通过表单上的按钮来实现。当您直接在表中删除行时,我认为无法在访问中执行此操作。

    【讨论】:

    • 有趣。我不知道。
    猜你喜欢
    • 2018-08-30
    • 2015-01-10
    • 2016-05-04
    • 1970-01-01
    • 2018-11-17
    • 2018-11-14
    • 2019-10-29
    • 1970-01-01
    • 2012-03-07
    相关资源
    最近更新 更多