MySQL CHECK約束失效問題
在定義資料庫表時,新增約束來確保資料完整性非常重要。 CHECK約束可讓您指定特定列的值必須滿足的條件。然而,在MySQL 8.0.15及更早版本中,CHECK約束並未被強制執行,這是一種特殊情況。
舉例說明:
<code class="language-sql">CREATE TABLE Customer ( SD integer CHECK (SD > 0), Last_Name varchar (30), First_Name varchar(30) );</code>
建立此表後,嘗試插入SD值為負數的行:
<code class="language-sql">INSERT INTO Customer values ('-2', 'abc', 'zz');</code>
MySQL不會報錯,即使插入的值違反了指定的CHECK約束。這是因為根據MySQL參考手冊:
<code>CHECK子句会被解析,但所有存储引擎都会忽略它。</code>
解:
為了解決這個問題,您可以採取以下方法之一:
<code class="language-sql">mysql> delimiter // mysql> 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 -> // mysql> delimiter ;</code>
請注意,上面的觸發器範例將負數的SD值設為0,您可以根據實際需求修改觸發器邏輯。
以上是為什麼MySQL CHECK約束在8.0.16之前的版本失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!