MySQL 檢查約束(CHECK)可以透過 CREATE TABLE 或 ALTER TABLE 語句實現,根據使用者實際的完整性要求來定義。它可以分別對列或表實施 CHECK 約束。但mysql手冊裡寫的很清楚:「所有的儲存引擎都對CHECK子句進行分析,但是忽略CHECK子句。」所以雖然可以這樣寫可並不會起到約束作用。
推薦教學:MySQL教學
#檢查約束使用 CHECK 關鍵字,具體的語法格式如下:
CHECK <表达式>
其中:<表達式>指的就是SQL 表達式,用來指定需要檢查的限定條件。
若將 CHECK 約束子句置於表中某個列的定義之後,則這種約束也稱為基於列的 CHECK 約束。
在更新表格資料的時候,系統會檢查更新後的資料行是否符合 CHECK 限制中的限定條件。 MySQL 可以使用簡單的表達式來實現 CHECK 約束,也允許使用複雜的表達式作為限定條件,例如在限定條件中加入子查詢。
注意:若將 CHECK 約束子句置於所有列的定義以及主鍵約束和外鍵定義之後,則這種約束也稱為基於表的 CHECK 約束。此約束可以同時對錶中多個列設定限定條件。
在建立表格時設定檢查約束
建立表格時設定檢查約束的語法規則如下:
CHECK(<检查约束>)
在test_db 資料庫中建立tb_emp7 數據表,要求salary 欄位值大於0 且小於10000,輸入的SQL 語句和運行結果如下所示。
mysql> CREATE TABLE tb_emp7 -> ( -> id INT(11) PRIMARY KEY, -> name VARCHAR(25), -> deptId INT(11), -> salary FLOAT, -> CHECK(salary>0 AND salary<100), -> FOREIGN KEY(deptId) REFERENCES tb_dept1(id) -> ); Query OK, 0 rows affected (0.37 sec)
在修改表時新增檢查約束
修改表時設定檢查約束的語法規則如下:
ALTER TABLE tb_emp7 ADD CONSTRAINT <检查约束名> CHECK(<检查约束>)
修改tb_dept 資料表,要求id 欄位值大於0,輸入的SQL 語句和執行結果如下所示。
mysql> ALTER TABLE tb_emp7 -> ADD CONSTRAINT check_id -> CHECK(id>0); Query OK, 0 rows affected (0.19 sec) Records: 0 Duplicates: 0 Warnings: 0
解決方法:使用觸發器實作CHECK檢查約束的功能。
(1)建立tb_student(學生資訊表)。
-- 创建学生信息表 CREATE TABLE tb_student ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), age INT NOT NULL );
(2)建立檢查年齡(age)欄位是否有效的觸發器。
-- 创建触发器 CREATE TRIGGER trg_tb_student_insert_check BEFORE INSERT ON tb_student FOR EACH ROW BEGIN DECLARE msg varchar(100); IF NEW.age <= 0 OR NEW.age >= 100 THEN SET msg = CONCAT('您输入的年龄值:',NEW.age,' 为无效的年龄,请输入0到100以内的有效数字。'); SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg; END IF; END;
(3)寫測試語句。
INSERT INTO tb_student(name,age) VALUES('Kevin',120);
以上是mysql檢查約束怎麼寫的詳細內容。更多資訊請關注PHP中文網其他相關文章!