我无法在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
希望你能帮助我解决这个问题。谢谢。
答案 0 :(得分:2)
您可以使用新的data macros
在MS Access 2010中轻松完成此操作当表在MS Access之外使用时,数据宏甚至可以工作。请注意关键字Old
,应用于创建After Delete宏的Staff表。行/* delete
是一条评论,纯粹是为了说明。
答案 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 table。 ON DELETE SET NULL
有几个“陷阱”。
答案 2 :(得分:1)
我认为你不能那样做。您可以自动删除无效的子行,但没有内置函数将其设置为null。
如果您的设计真的需要这个,那么您只能通过vba执行此操作,但这只能通过表单上的按钮实现。当您直接在表中删除行时,我认为无法在访问中执行此操作。