2

我无法在 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

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

4

3 回答 3

2

您可以在 MS Access 2010 中使用新的数据宏轻松完成此操作

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

删除数据宏

于 2013-01-20T14:55:07.703 回答
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的记录。该删除导致cust1的值从 2 更改为 Null。Customer.processed_By

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

于 2013-01-20T16:54:26.580 回答
1

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

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

于 2013-01-20T14:13:08.927 回答