[英]Is there a way to make a column's nullability depend on another column's nullability?
我在數據庫表中有兩列(以及其他列):ExitDate和ExitReason。 我們的業務邏輯要求在指定ExitDate時指定ExitReason。 ExitDate列需要允許空值,因為在插入時並不總是知道該值。 有沒有辦法讓ExitReason列僅在ExitDate值為null時才允許空值? 我可以通過將這兩列分成單獨的“退出日期”表並使它們都不可為空來完成效果,但如果我不必這樣做會很好。
想法? 謝謝!
假設您使用的是SQL Server或類似的東西,可以使用表上的CHECK
約束來執行此操作。 (不幸的是,MySQL 解析但忽略了 CHECK
約束,所以你必須使用該平台的觸發器。)
如果表已存在:
ALTER TABLE ADD CONSTRAINT CK_ExitDateReason
CHECK (
(ExitDate IS NULL AND ExitReason IS NULL)
OR (ExitDate IS NOT NULL AND ExitReason IS NOT NULL)
);
如果您自己創建表:
CREATE TABLE dbo.Exit (
...
, CONSTRAINT CK_ExitDateReason CHECK ...
);
使用檢查約束比使用觸發器更可取,因為:
我可以通過將這兩列分成單獨的“退出日期”表並使它們都不可為空來完成效果,但如果我不必這樣做會很好。
這聽起來是一個非常好的解決方案。 如果你使用MySQL,那么它可能是最好的解決方案,因為不支持CHECK約束。
MS Access提供了另一種實現目標的方法。 使用“設計視圖”中的表,打開屬性表。 與字段的驗證規則相反,表規則可以引用表中的其他字段。
將此作為表的Validation Rule屬性的單行添加。
([ExitDate] IS NULL AND [ExitReason] IS NULL)
OR ([ExitDate] IS NOT NULL AND [ExitReason] IS NOT NULL)
它類似於提供的CHECK CONSTRAINT @NickChammas。 我在ExitDate和ExitReason周圍放了方括號,因為沒有括號Access會將它們解釋為文本文字值,所以添加這樣的引號......這將不起作用:
("ExitDate" IS NULL AND "ExitReason" IS NULL)
OR ("ExitDate" IS NOT NULL AND "ExitReason" IS NOT NULL)
如果要包含一個用戶友好的消息作為表的Validation Text屬性,以便在違反驗證規則時顯示,則可能會發現此方法更方便:
"Provide values for both ExitDate and ExitReason, or leave both blank."
編輯 :@AndriyM的建議作為MS Access表驗證規則:
([ExitDate] Is Null) = ([ExitReason] Is Null)
可以使用MS Access進行檢查,但只能通過ADO進行檢查。
sSQL = "ALTER TABLE customer ADD CONSTRAINT CK_ExitDateReason " _
& "CHECK ((ExitDate IS NULL) = (ExitReason IS NULL))"
CurrentProject.Connection.Execute sSQL
約束只能通過ADO刪除。 但是,您可以自由添加和刪除列(字段)而不會影響檢查。
還可以添加引用另一個表的檢查。
如果您使用帶有表單的表,則返回的錯誤將是3317.您可以接受默認消息或提供您自己的消息,如下所示:
Private Sub Form_Error(DataErr As Integer, Response As Integer)
If DataErr = 3317 And IsNull(Me.ExitReason) Then
MsgBox "Please fill in a reason"
Response = acDataErrContinue
End If
End Sub
您可以使用觸發器強制執行此操作:如果您將ExitDate設置為null以外的值並且ExitReason保留為null或者設置為null,則會拋出錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.