首頁  >  文章  >  資料庫  >  MySQL怎麼使用check約束

MySQL怎麼使用check約束

(*-*)浩
(*-*)浩原創
2019-05-07 13:57:0120667瀏覽

MySQL使用check約束的方法:1、如果要設定CHECK約束的欄位範圍小,並且比較容易列舉全部的值,可以將該欄位的類型設為enum型別或set型別。 2.如果需要設定CHECK約束的欄位範圍大,且列舉全部值比較困難,使用觸發器來取代約束實現資料的有效性了。

MySQL怎麼使用check約束

在某些情況下,我們需要欄位在指定範圍的輸入,

例如:性別只能輸入'男'或'女',餘額只能大於0等條件,

例如:可以要求authors 表的postcode 欄位只允許輸入六位數的郵遞區號。

我們除了在程式上控制以外,我們還能使用 CHECK 約束 來規範資料。

然而:
mysql所有的儲存引擎均不支援check約束,MySQL會對check子句進行分析,但插入資料時會忽略,因此check並不起作用。

解決這個問題的兩種方式:

1、如果要設定CHECK約束的欄位範圍小,並且比較容易列舉全部的值,就可以考慮將此欄位的類型設定為枚舉類型enum()或集合類型set()。

例如性別欄位可以這樣設置,插入枚舉值以外值的操作將不被允許。

CREATE TABLE `Student` (
  `Sno` char(8) NOT NULL,
  `Sname` varchar(10) NOT NULL,
  `Sex` enum('男','女') NOT NULL DEFAULT '男',
  `Age` tinyint(4) NOT NULL DEFAULT '20',
  `Phonenumber` char(12) DEFAULT NULL,
  `Sdept` varchar(20) NOT NULL,
  PRIMARY KEY (`Sno`),
  UNIQUE KEY `Phonenumber` (`Phonenumber`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、如果需要設定CHECK約束的欄位範圍大,且列舉全部值比較困難,例如整數或某一區間,那就只能使用觸發器來取代約束實現資料的有效性了。

DELIMITER $
create trigger studentcheck before insert on Student for each row
begin
if new.Age<15 or new.Age>30 then set new.Age=20;end if;
end $
DELIMITER ;

測試:

mysql> insert into Student(Sno,Sname,Sex,Age,Phonenumber,Sdept) values('5','Joe','m',0,'12345243912','CS');
ERROR 1265 (01000): Data truncated for column 'Sex' at row 1
mysql> insert into Student(Sno,Sname,Sex,Age,Phonenumber,Sdept) values('5','Joe','男',0,'12345243912','CS');
Query OK, 1 row affected (0.00 sec)

mysql> select * from Student;
+-----+-------+-----+-----+-------------+-------+
| Sno | Sname | Sex | Age | Phonenumber | Sdept |
+-----+-------+-----+-----+-------------+-------+
| 4   | nancy | m   |   0 | 12345243965 | CS    |
| 5   | Joe   | 男  |  20 | 12345243912 | CS    |
+-----+-------+-----+-----+-------------+-------+
2 rows in set (0.00 sec)

可以看出,現在Sex必須在「男」和「女」中選擇,否則插入失敗;當年齡不合規範時,由於觸發器的存在,會將其自動設定為預設的20。

由此可以解決check約束無效的問題。

以上是MySQL怎麼使用check約束的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn