2013-01-20 53 views
2

我無法在MS訪問中設置默認或空值。例如,當我試圖刪除父行時,受影響的子行的外鍵未設置爲NULL。我試圖在設計視圖中將默認值設置爲NULL,但它似乎不起作用。設置默認值或爲MS訪問中的外鍵設置空值

這裏是我的樣本數據:
在員工表:
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

請添加更多詳細信息,例如,樣本數據和/或不適合您的代碼。 – Fionnuala

+1

嗨Remou,我用樣本數據更新了它。希望這有助於 – Dale

回答

2

可以在MS Access 2010中新data macros

數據宏做到這一點很容易夠表格時使用的MS Access之外甚至工作。請注意關鍵字Old,應用於創建After刪除宏後的Staff表。該行/* delete是一個評論,純粹是爲了說明。

delete data macro

+0

嘿Remou,數據宏可以創造奇蹟。謝謝:) – Dale

1

我不認爲你可以做到這一點。您可以自動刪除無效的子行,但沒有內置函數將其設置爲空。

如果你的設計真的需要這個,你只能通過vba來做到這一點,但這隻能通過一個窗體上的按鈕來實現。當您直接在表中刪除行時,我無法在訪問中執行此操作。

+0

不完全正確。 – Fionnuala

+0

有趣。我不知道。 – KekuSemau

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 

之後,我刪除了staff記錄。該刪除導致cust12Customer.processed_By值從2更改爲Null。

如果這種方法聽起來很有趣,可以從Allen Browne的Cascade to Null Relations以及Stack Overflow問題:MS Access set cascade-to-null constraint to existing table中找到更多信息。有幾個「陷阱」與ON DELETE SET NULL

+1

嗯,這似乎是一個相當合理的功能。你知道他們爲什麼會保持這種隱藏的用戶界面嗎? – KekuSemau

+0

不完全是這樣,但我懷疑這不是一個故意的選擇來保持隱藏......更有可能他們沒有看到足夠的價值在UI中公開它。我認爲這與其他Jet 4功能(檢查約束作爲一個示例)類似,這些功能從未在UI中公開過。 – HansUp

+0

如果你測試我提供的例子,你可能會從'staff'表中刪除* Tim *時看到這條消息:http://allenbrowne.com/graphics/CascadeDeleteDialog.gif這對我來說並不合適。我說'ON DELETE SET NULL'被支持,但我沒有說它支持的很好。 :-) – HansUp