在MS访问中为外键设置默认值或设置为null

时间:2013-01-20 10:37:20

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

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

OR

ID | Name | processed_By
1 | cust1 | 1

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

3 个答案:

答案 0 :(得分:2)

您可以使用新的data macros

在MS Access 2010中轻松完成此操作

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

delete data macro

答案 1 :(得分: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

之后,我删除了 Tim staff记录。该删除导致 cust1 Customer.processed_By值从2更改为Null。

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

答案 2 :(得分:1)

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

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