MySQL虽然输入check语句不会报错,但是实际上并没有check的功能。但是MySQL 依然可以利用触发器来实现相应功能。

本文将根据两个例子简要阐述MySQL实现checkassertion的思路。

MySQL触发器 官方文档 MySQL Signal 官方文档

注意

signal异常处理功能在MySQL5.5版本以后才出现。之前的版本可以选择对相应值进行操作而不是报错。

下文测试所用数据库版本为Server version: 10.1.21-MariaDB Source distribution

check实现

例子1是希望能够对插入表项有约束,例如年龄不能超过60,若大于60则报错,拒绝插入。

对于其他的支持check的数据库,可以用以下语句来实现:

alter table emp add constraint c_age check(age<60);

而利用触发器,则可以写如下语句

delimiter //
create trigger age before insert
on emp for each row
begin
declare msg varchar(200);
if (new.age > 60) then
set msg = "Age is above 60. Cannot insert.";
signal sqlstate 'HY000' SET message_text = msg;
end if;
end //
delimiter ;

(最后记得恢复;为结束标志) 将其保存至1.sql,测试其功能

MariaDB [book5]> source path/to/it/1.sql
Query OK, 0 rows affected (0.03 sec) MariaDB [book5]> insert into emp values(3,'bobo',61,'softeng',10000,1);
ERROR 1644 (HY000): Age is above 60. Cannot insert.

assertion实现

例子2 是希望限制两个表的元组总数不能超过5。

支持assertion的数据库可以用以下语句实现:

create assertion asse_count
check(50>=select count(*) from
(select * from male union select * from female) as guest);

利用触发器也可实现这个功能。

delimiter //
create trigger count_check_male before insert
on male for each row
begin
declare msg varchar(200);
declare count int;
set count = (select count(*) from male);
set count = count + (select count(*) from female);
if (count >= 5) then
set msg = "The count of guest is above 5.";
signal sqlstate 'HY000' SET message_text = msg;
end if;
end //
create trigger count_check_female before insert
on female for each row
begin
declare msg varchar(200);
declare count int;
set count = (select count(*) from male);
set count = count + (select count(*) from female);
if (count >= 5) then
set msg = "The count of guest is above 5.";
signal sqlstate 'HY000' SET message_text = msg;
end if;
end //
delimiter ;

由于是插入之前进行处理,这里要注意为count >= 5

在利用聚集函数结果对变量进行赋值时记得加括号。

测试触发器功能:

MariaDB [book5]> select count(*) from female;
+----------+
| count(*) |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec) MariaDB [book5]> select count(*) from male;
+----------+
| count(*) |
+----------+
| 2 |
+----------+
1 row in set (0.00 sec) MariaDB [book5]> insert into male values(3,"test");
ERROR 1644 (HY000): The count of guest is above 5.

利用MySQL触发器实现check和assertion的更多相关文章

  1. mysql学习之check无效的解决及触发器的使用

    SQL的约束种类: 一.非空约束 not null 二.唯一约束 unique 三.主键约束 四.外键约束 五.check约束 该约束可用于列之间检查语义限制的,实际应用过程中非常常用!! 然鹅,My ...

  2. mysql触发器使用方法具体解释

    MySQL触发器语法具体解释: 触发器 trigger是一种特殊的存储过程.他在插入(inset).删除(delete)或改动(update)特定表中的数据时触发运行,它比数据本身标准的功能更精细和更 ...

  3. MySQL8.0数据库出现的问题——外码创建方式、外键约束两个引用列不兼容问题、check约束问题、用触发器代替check约束、关键字DELIMITER、删除添加索引、删除添加外键约束、和一些数据库方面的操作

    一.首先先说一下我们都需要建立那些表 mysql> CREATE TABLE IF NOT EXISTS `student`( -> `sno` CHAR(8) NOT NULL, -&g ...

  4. 4. 利用MySQL Shell安装部署MGR集群 | 深入浅出MGR

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 1. 安装准备 2. 利用MySQL Shell构建MGR集群 3. MySQL Shell接管现存的MGR集群 4 ...

  5. 创建ASP.NET Core MVC应用程序(2)-利用MySQL Connector NET连接到MySQL

    创建ASP.NET Core MVC应用程序(2)-利用MySQL Connector NET连接到MySQL 用惯.NET的研发人员都习惯性地使用SQLServer作为数据库.然而.NET Core ...

  6. MySQL触发器如何正确使用

    MySQL触发器如何正确使用 2010-05-18 15:58 佚名 博客园 字号:T | T 我们今天主要向大家介绍的是MySQL触发器进行正确使用,其中包括对MySQL触发器发器的语句创建,触发时 ...

  7. 【转】mysql触发器的实战(触发器执行失败,sql会回滚吗)

    1   引言Mysql的触发器和存储过程一样,都是嵌入到mysql的一段程序.触发器是mysql5新增的功能,目前线上凤巢系统.北斗系统以及哥伦布系统使用的数据库均是mysql5.0.45版本,很多程 ...

  8. 利用Mysql提供的字符串方法查找字符串中某字符出现的次数

    有这么一个需求,查出分类中没有子分类的一级分类,脑海中首次出现的解决思路和这样的 先使用PHP查出所有的一级分类 递归查询一级分类是否有子分类 将没有子分类的一级分类汇总 但觉的这样处理太麻烦了,然后 ...

  9. 利用mysql对特殊字符和超长字符会进行截断的特性 进行存储型XSS攻击——WordPress <4.1.2 & <=4.2 存储型xss

    转自:Baidu Security LabXteam http://xteam.baidu.com/?p=177 漏洞概述 本次漏洞出现两个使用不同方式截断来实现的存储型xss,一种为特殊字符截断,一 ...

随机推荐

  1. [js高手之路] es6系列教程 - 不定参数与展开运算符(...)

    三个点(...)在es6中,有两个含义: 用在形参中, 表示传递给他的参数集合, 类似于arguments, 叫不定参数. 语法格式:  在形参面前加三个点( ... ) 用在数组前面,可以把数组的值 ...

  2. JavaScript高程--<script>标签

    <script>标签 在HTML5中script主要有以下几个属性:async,defer,charset,src,type, async(可选): 关键词:异步脚本,外部文件,立即下载: ...

  3. 实例甜点 Unreal Engine 4迷你教程(6)之三个重要基础操作SpawnActor、TArray的Add和Remove

    本小节的教程需要完成前置教程:建议阅读<实例甜点 Unreal Engine 4迷你教程(5)>,因为5里面提到了本节的工程,不过也可以在不看5的前提下直接阅读本教程. 第一步:Empty ...

  4. Pycharm中的加载多个项目

    使用Pycharm,总会创建几个项目文件,有时候又不想全部一个一个的打开,所以这时候需要一个项目共存的方法,现在说一下怎么项目共存. 中英文对照 英文:首先打开setting界面: 中文首先打开设置界 ...

  5. 前端开发工具Brackets介绍,安装及安装Emme插件时踩过的坑

    对于前端开发的园友来说有可能IDE工具有很多,层次不穷,还有每个人的喜好及习惯也不一样,因为我是一名后端开发的.Net程序员,但是大家都知道,现在都提倡什么全栈工程师,所以也得会点前端开发,所以我对于 ...

  6. java中List Array相互转换

    List to Array List 提供了toArray的接口,所以可以直接调用,转为object型数组 List<String> list = new ArrayList<Str ...

  7. 在django中集成ckeditor富文本

    目前用的比较多的富文本插件有百度的ueditor.ckeditor.kindeditor等,其中ueditor和kindeditor比较美观,ckeditor的皮肤较少.但是ueditor加载较慢,k ...

  8. MySQL表空间集

    --MySQL表空间集 ----------------------2014-09-20 1. 收缩ibdata的方法,目前MySQL依然没有提供收缩ibdata的方法,只能重构,下面是5.7的步骤. ...

  9. shell /bin/bash^M: bad interpreter错误解决

      错误原因之一很有可能是你的脚本文件是DOS格式的, 即每一行的行尾以\r\n来标识, 其ASCII码分别是0x0D, 0x0A.可以有很多种办法看这个文件是DOS格式的还是UNIX格式的, 还是M ...

  10. CSSc常用样式

          一.CSS常用文本属性 1.css中的颜色表示方式   1.1直接使用颜色的单词表示:red.green.blue     1.2使用颜色的十六进制表示:#ff0000,#00ff00: ...