了解 MySQL 中的 CHECK 約束行為
MySQL 對 CHECK 約束的處理有時可能會出乎意料。 即使定義正確,CHECK 約束也可能看起來不活動。 關鍵是了解MySQL版本相容性。
MySQL 8.0.16 是第一個完全支援 CHECK 限制的版本。 如果您的 MySQL 版本早於 8.0.16,則 CHECK
子句將被所有儲存引擎解析但忽略。 違反約束的資料將被正確插入。
查閱官方MySQL參考手冊(https://www.php.cn/link/e6c19a87ef9e816e02ce247d4f41d38a)來確認您的MySQL版本的功能。
CHECK 約束的替代方案(對於較舊的 MySQL 版本):
如果您的 MySQL 版本缺乏 CHECK 約束支持,請考慮使用觸發器。觸發器執行自訂程式碼以回應行插入等資料庫事件。 觸發器可以在插入之前驗證數據,確保數據完整性。
例如,為 SD
表中的 Customer
欄位強制執行非負值的觸發器可以是:
<code class="language-sql">DELIMITER // CREATE TRIGGER trig_sd_check BEFORE INSERT ON Customer FOR EACH ROW BEGIN IF NEW.SD < 0 THEN SET NEW.SD = 0; END IF; END // DELIMITER ;</code>
此觸發器攔截 INSERT
表上的 Customer
語句。如果 SD
為負數,則觸發器將其設為零。 這提供了與 CHECK
約束類似的功能。
以上是為什麼我的 MySQL CHECK 約束不起作用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!