<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在MySQL 8.0.16以前, CREATE TABLE允許從語法層面輸入下列CHECK約束,但實際沒有效果:
CHECK (expr)
在 MySQL 8.0.16,CREATE TABLE新增了針對所有儲存引擎的表和列的CHECK約束的核心特性。CREATE TABLE允許如下針對表或列的約束語法:
[CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]
${table_name}_check_${seq_num}
的約束名稱,約束名稱是大小寫敏感的,且最長可以到64個字元範例如下:
CREATE TABLE t1 ( CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive CHECK (c2 > 0), c3 INT CHECK (c3 < 100), CONSTRAINT c1_nonzero CHECK (c1 <> 0), CHECK (c1 > c3) );
以上範例包含了列約束和表約束,命名和未命名的格式:
如果想檢視上述命令所生成的約束名,可以輸入以下SHOW CREATE TABLE命令:
mysql> SHOW CREATE TABLE t1G *************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` int(11) DEFAULT NULL, `c3` int(11) DEFAULT NULL, CONSTRAINT `c1_nonzero` CHECK ((`c1` <> 0)), CONSTRAINT `c2_positive` CHECK ((`c2` > 0)), CONSTRAINT `t1_chk_1` CHECK ((`c1` <> `c2`)), CONSTRAINT `t1_chk_2` CHECK ((`c1` > 10)), CONSTRAINT `t1_chk_3` CHECK ((`c3` < 100)), CONSTRAINT `t1_chk_4` CHECK ((`c1` > `c3`)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
SQL規範要求:所有約束(包括:PRIMARY KEY, UNIQUE,FOREIGN KEY, CHECK)屬於同一個名稱空間(NAMESPACE),在MySQL實現中,所有的約束型別在每個schema (database)內有自己的名稱空間。所以,CHECK約束的名稱在SCHEMA內必須唯一,也就是說不允許有兩張表使用同一個CHECK約束名稱。(例外:一個臨時表可能使用與非臨時表一樣的約束名稱)
CHECK的條件表示式必須遵守以下規則,如果包含不允許的結構,將會觸發錯誤:
另外,在INFORMATION_SCHEMA的CHECK_CONSTRAINTS表中存放著所有表中定義的CHECK約束的資訊。
複雜業務場景下的約束,從架構角度看,允許有不同的實現方式:
放在資料庫表中,通過約束實現,但不支援子查詢
放在資料庫中,通過觸發器(TRIGGER)實現
放在應用程式的邏輯中,在提前資料庫前檢查
一般性的,選擇不同方式的原則如下:
如果CHECK約束可以實現,且約束比較穩定,一般用CHECK約束實現,比如:年齡不允許為負數,不允許>150等,比如:
CREATE TABLE Departments ( ID int NOT NULL, PID int NOT NULL, Name varchar(255) NOT NULL Default '', CHECK (ID>=1) ); -- add check separately ALTER TABLE Departments ADD CONSTRAINT CHK_PID CHECK (ID>=1 AND PID >=0); -- remove check ALTER TABLE Departments DROP CHECK CHK_PID;
如果屬於資料庫邏輯,比如:審計,外來鍵可以使用觸發器
CREATE TABLE IF NOT EXISTS `department` ( `id` int NOT NULL AUTO_INCREMENT, `pid` int COMMENT 'parent id', `name` varchar(100) NOT NULL, PRIMARY KEY (`id`) ) ENGINE = InnoDB; CREATE TRIGGER pid_insert_check BEFORE INSERT ON department FOR EACH ROW BEGIN IF (NEW.pid <> 0 AND NEW.pid NOT IN (select id from department)) THEN signal sqlstate '45000' set message_text = 'department parent id has to be chosen from id'; END IF; END CREATE TRIGGER pid_delete_check BEFORE DELETE ON department FOR EACH ROW BEGIN IF (OLD.id < 0 OR OLD.id IN (select pid from department)) THEN signal sqlstate '45000' set message_text = 'department parent id has to be chosen from id'; END IF; END
如果屬於業務邏輯,建議放在應用層處理,方便開發者:理解和維護,但是:也需要通過強化業務管理,避免特權使用者偶發操作引起對資料完整性的破壞
到此這篇關於Mysql中的CHECK約束特性詳解的文章就介紹到這了,更多相關Mysql中CHECK約束內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45