簡體   English   中英

有沒有辦法讓列的可空性取決於另一列的可空性?

[英]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

更多信息: 用於Access 2000的中間Microsoft Jet SQL

您可以使用觸發器強制執行此操作:如果您將ExitDate設置為null以外的值並且ExitReason保留為null或者設置為null,則會拋出錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM