MySQL中的CHECK約束
在嘗試向MySQL表新增CHECK約束時,當插入違反約束的資料時,可能會遇到意外行為。本文將深入探討MySQL中CHECK限制的細微之處,並提供一個強制驗證的解決方案。
在MySQL的早期版本(直到8.0.15)中,CHECK約束已定義但未強制執行。如同MySQL參考手冊所述:「CHECK子句由所有儲存引擎解析但被忽略。」
MySQL 8.0.15及更早版本的解決方案
為了在缺乏原生CHECK約束支援的情況下強制執行資料驗證,您可以建立一個觸發器:
<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語句,如果SD列的值小於0,則將其修改為0,確保約束得到維護。
MySQL 8.0.16及更高版本的CHECK限制
MySQL 8.0.16引入了對CHECK約束的全面支援。若要在8.0.16或更高版本中定義CHECK約束,請使用下列語法:
<code class="language-sql">CREATE TABLE Customer ( SD integer CHECK (SD > 0), Last_Name varchar (30), First_Name varchar(30) );</code>
MySQL現在將強制執行約束,並阻止插入違反約束的資料。
以上是MySQL CHECK 約束如何運作,以及如何確保舊版本和新版本中的資料驗證?的詳細內容。更多資訊請關注PHP中文網其他相關文章!