利用MySQL触发器实现check和assertion
MySQL
虽然输入check
语句不会报错,但是实际上并没有check
的功能。但是MySQL
依然可以利用触发器来实现相应功能。
本文将根据两个例子简要阐述MySQL
实现check
和assertion
的思路。
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的更多相关文章
- mysql学习之check无效的解决及触发器的使用
SQL的约束种类: 一.非空约束 not null 二.唯一约束 unique 三.主键约束 四.外键约束 五.check约束 该约束可用于列之间检查语义限制的,实际应用过程中非常常用!! 然鹅,My ...
- mysql触发器使用方法具体解释
MySQL触发器语法具体解释: 触发器 trigger是一种特殊的存储过程.他在插入(inset).删除(delete)或改动(update)特定表中的数据时触发运行,它比数据本身标准的功能更精细和更 ...
- MySQL8.0数据库出现的问题——外码创建方式、外键约束两个引用列不兼容问题、check约束问题、用触发器代替check约束、关键字DELIMITER、删除添加索引、删除添加外键约束、和一些数据库方面的操作
一.首先先说一下我们都需要建立那些表 mysql> CREATE TABLE IF NOT EXISTS `student`( -> `sno` CHAR(8) NOT NULL, -&g ...
- 4. 利用MySQL Shell安装部署MGR集群 | 深入浅出MGR
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 1. 安装准备 2. 利用MySQL Shell构建MGR集群 3. MySQL Shell接管现存的MGR集群 4 ...
- 创建ASP.NET Core MVC应用程序(2)-利用MySQL Connector NET连接到MySQL
创建ASP.NET Core MVC应用程序(2)-利用MySQL Connector NET连接到MySQL 用惯.NET的研发人员都习惯性地使用SQLServer作为数据库.然而.NET Core ...
- MySQL触发器如何正确使用
MySQL触发器如何正确使用 2010-05-18 15:58 佚名 博客园 字号:T | T 我们今天主要向大家介绍的是MySQL触发器进行正确使用,其中包括对MySQL触发器发器的语句创建,触发时 ...
- 【转】mysql触发器的实战(触发器执行失败,sql会回滚吗)
1 引言Mysql的触发器和存储过程一样,都是嵌入到mysql的一段程序.触发器是mysql5新增的功能,目前线上凤巢系统.北斗系统以及哥伦布系统使用的数据库均是mysql5.0.45版本,很多程 ...
- 利用Mysql提供的字符串方法查找字符串中某字符出现的次数
有这么一个需求,查出分类中没有子分类的一级分类,脑海中首次出现的解决思路和这样的 先使用PHP查出所有的一级分类 递归查询一级分类是否有子分类 将没有子分类的一级分类汇总 但觉的这样处理太麻烦了,然后 ...
- 利用mysql对特殊字符和超长字符会进行截断的特性 进行存储型XSS攻击——WordPress <4.1.2 & <=4.2 存储型xss
转自:Baidu Security LabXteam http://xteam.baidu.com/?p=177 漏洞概述 本次漏洞出现两个使用不同方式截断来实现的存储型xss,一种为特殊字符截断,一 ...
随机推荐
- 超强、超详细Redis数据库入门教程(转载)
这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使 ...
- 全面理解Javascript中Promise
全面理解Javascript中Promise 最近在学习Promise的时候,在网上收集了一些资料,发现很多的知识点不够系统,所以小编特意为大家整理了一些自认为 比较好的文章,供大家更好地学习js中非 ...
- 使用我的编译器,下面的代码 int i=7; printf("%d\n", i++ * i++); 返回 49?不管按什么顺序计算, 难道不该打印出56吗?
尽管后缀自加和后缀自减操作符 ++ 和 -- 在输出其旧值之后才会执行运算, 但这里的"之后"常常被误解.没有任何保证确保自增或自减会在输出变量原值之 后和对表达式的其它部分进行计 ...
- JDK、Eclipse、Myeclipse、Tomcat等各种软件的版本详解(写给对版本和兼容性问题焦头烂额的你)
这篇文章我们来探讨一下关于JDK.Eclipse.Myeclipse.Tomcat的版本问题.一.关于版本的几个概念1.32位和64位两个版本: 简言之,64位的操作系统支持识别4G以上的内存条 ...
- Linux修改IP,DNS和网关
以Red Hat Enterprise Linux 5.2为例1.最常用的给网卡配置ip的命令为 #ifconfig eth0 192.168.0.1 netmask 255.255.255.0 up ...
- java 数组的冒泡排序
冒泡排序 (1)冒泡排序算法的运作如下:(从后往前) 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最 ...
- re模块的结果小练习题
1.匹配标签 import re ret = re.search('<(?P<tag_name>\w+)>\w+</(?P=tag_name)>','<h1& ...
- 模拟exit()退出命令实现
1.当输入exit命令是退出程序,如果输入其他的就打印====> 方法一while True: username=input("请输入你的用户名:>>>") ...
- 前端应该知道的Web Components
前端组件化的痛点 在前端组件化横行的今天,确实极大的提升了开发效率.不过有一个问题不得不被重视,拟引入的这些html.css.js代码有可能对你的其他代码造成影响. 虽然我们可以通过命名空间.闭包等一 ...
- Web.Config文件详解
一).Web.Config是以XML文件规范存储,配置文件分为以下格式 1.配置节处理程序声明 特点: 位于配置文件的顶部,包含在<configSections>标志中. ...