Mysql

MySQL將幾列定義為空或非空的最佳方法

  • March 30, 2021

在 MySQL 數據庫上,我想找到一種方法來強制幾個列在插入/更新時都為空或不為空。這意味著在每條記錄上,兩列都為空,或者兩列都不為空。是否有任何特定的限制,或者我可以通過 BEFORE INSERT / BEFORE UPDATE 觸發器來做到這一點?

換句話說,如果記錄的一列是空的並且它被更新設置為一個值,那麼該記錄的另一列也必須用一個非空值更新。如果該列不是 null,我可以用另一個值(可選,另一個)來更新它,但是如果我將它設置為 null,則另一個列也必須由更新查詢設置為 null(沒有“預設”設置)。

謝謝你。

我應該認為這裡可以使用表級 CHECK 約束,例如

CONSTRAINT c1_c2_null_match
 CHECK ((c1 IS NULL AND c2 IS NULL)
    OR  (c1 IS NOT NULL AND c2 IS NOT NULL))

請參閱MySQL 8.0 文件

您可以改為使用觸發器,但這樣可能會遇到一致性問題。某些批量載入操作將繞過觸發器,這意味著根本不會執行檢查並允許違反條件。可以暫時禁用約束,但重新啟用約束時將執行檢查。

注意:您沒有提及您使用的是哪個版本的 MySQL,但在 8.0.16 之前,CHECK 約束被忽略,因此您需要使用觸發器來執行您想要的操作。

要使用觸發器執行此操作,如果欄位不匹配,您需要返回錯誤,如下所示:

DELIMITER //
CREATE TRIGGER c1_c2_null_match BEFORE UPDATE ON tbl
 FOR EACH ROW
 BEGIN
   IF (NEW.c1 IS NULL AND NEW.c2 IS NOT NULL)
   OR (NEW.c1 IS NOT NULL AND NEW.c2 IS NULL)
     SIGNAL SQLSTATE '45000'
     SET MESSAGE_TEXT = 'Null columns must match';
   END IF;
 END //
DELIMITER;

請參閱此堆棧溢出問題。

希望有幫助。

引用自:https://dba.stackexchange.com/questions/288946