首頁 > 資料庫 > mysql教程 > 為什麼MySQL CHECK約束在8.0.16之前的版本失敗?

為什麼MySQL CHECK約束在8.0.16之前的版本失敗?

Patricia Arquette
發布: 2025-01-10 10:43:43
原創
312 人瀏覽過

Why Do MySQL CHECK Constraints Fail in Versions Before 8.0.16?

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>
登入後複製

解:

為了解決這個問題,您可以採取以下方法之一:

  • 升級到MySQL 8.0.16或更高版本: 此版本開始支援CHECK限制。請參閱MySQL文件以了解更多詳情。
  • 實作觸發器: 觸發器可以用來強制儲存引擎忽略的約束。建立一個在插入之前檢查SD值的觸發器,如下所示,可以有效地強制執行約束:
<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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板