MySQL中存储函数创建与触发器设置的方法

存储函数也是过程式对象之一,与存储过程相似。这些代码片段包含sql和过程式语句,可以从应用程序和sql中调用。然而,他们也有一些%ign%ignore_a_1%re_a_1%

1、存储函数没有输出参数,因为存储函数本身就是输出参数。

2、不能用CALL语句来调用存储函数。

3、存储函数必须包含一条RETURN语句,而这条特殊的SQL语句不允许包含于存储过程中

1、创建存储函数

使用CREATE FUNCTION语句创建存储函数

语法格式: 

CREATE FUNCTION 存储函数名 ([参数[,…]])RETURNS 类型函数体

注:存储函数不能拥有与存储过程相同的名字。存储函数体中必须包含一个RETURN值语句,值为存储函数的返回值。

例:创建一个存储函数,其返回Book表中图书数目作为结果 

DELIMITER $$CREATE FUNCTION num_book()RETURNS INTEGERBEGINRETURN(SELECT COUNT(*)FROM Book);END$$DELIMITER ;

RETURN子句中包含SELECT语句时,SELECT语句的返回结果只能是一行且只能有一列值。即使该存储函数不需要参数,调用时也需要使用(),例如:num_book()。

例:创建一个存储函数来删除Sell表中有但Book表中不存在的记录 

DELIMITER $$CREATE FUNCTION del_sell(book_bh CHAR(20))RETURNS BOOLEANBEGINDECLARE bh CHAR(20);SELECT 图书编号 INTO bh FROM Book WHERE 图书编号=book_bh;IF bh IS NULL THENDELETE FROM Sell WHERE 图书编号=book_bh;RETURN TRUE;ELSERETURN FALSE;END IF;END$$DELIMITER ;

该存储函数给定图书编号作为输入参数,先按给定的图书编号到Book表查找看有没有该图书编号的书,如果没有,返回false,如果有,返回true。同时还要到Sell表中删除该图书编号的书。要列举数据库中的存储过程,使用SHOW FUNCTION STATUS命令即可。

2、调用存储函数

存储函数创建完后,调用存储函数的方法和使用系统提供的内置函数相同,都是使用SELECT关键字。

语法格式:

SELECT 存储函数名([参数[,…]])

例:创建一个存储函数publish_book,通过调用存储函数author_book获得图书的作者,并判断该作者是否姓“张”,是则返回出版时间,不是则返回“不合要求”。 

DELIMITER $$CREATE FUNCTION publish_book(b_name CHAR(20))RETURNS CHAR(20)BEGINDECLARE name CHAR(20);SELECT author_book(b_name)INTO name;IF name like'张%' THENRETURN(SELECT 出版时间 FROM Book WHERE 书名=b_name);ELSERETURN'不合要求';END IF;END$$DELIMITER ;

调用存储函数publish_book查看结果:

SELECT publish_book(‘计算机网络技术’);

删除存储函数的方法和删除存储过程的方法基本一样,使用DROP FUNCTION语句

语法格式:

DROP FUNCTION [IF EXISTS]存储函数名

注:IF EXISTS子句是MySQL的扩展,如果函数不存在,它防止发生错误

例:删除存储函数a 

DROP FUNCTION IF EXISTS a;

3、创建触发器

使用CREATE TRIGGER语句创建触发器

语法格式:

CREATE TRIGGER 触发器名 触发时间 触发事件
ON 表名 FOR EACH ROW 触发器动作

触发器有两种触发选项:BEFORE和AFTER,分别表示触发器是在激活它的语句之前或之后被触发。通常使用AFTER选项来在激活触发器后执行语句。BEFORE选项用于验证新数据是否符合使用限制。

包含SELECT语句的触发器会返回结果到客户端,为了避免这种情况,应该避免在触发器定义中使用SELECT语句。同样,也不能调用将数据返回客户端的存储过程。

例: 创建一个表table1,其中只有一列a,在表上创建一个触发器,每次插入操作时,将用户变量str的值设为TRIGGER IS WORKING。

CREATE TABLE table1(a INTEGER);CREATE TRIGGER table1_insert AFTER INSERTON table1 FOR EACH ROWSET@str='TRIGGER IS WORKING';

要查看数据库中有哪些触发器可以使用SHOW TRIGGERS命令。

在MySQL触发器中的SQL语句可以关联表中的任意列。但不能直接使用列的名称去标志,那会使系统混淆,因为激活触发器的语句可能已经修改、删除或添加了新的列名,而列的旧名同时存在。必须使用这种语法来标识:NEW.column_name或OLD.column_name。NEW.column_name用来引用新行的一列,OLD.column_name用来引用更新或删除它之前的已有行的一列。

对于INSERT语句,只有NEW是合法的,对于DELETE语句,只有OLD才合法。而UPDATE语句可以与NEW和OLD同时使用。

创建一个触发器,使得当删除表格“Book”中某本图书的信息时,同时删除所有与该图书有关的“Sell”表格中的数据。 

DELIMITER $$CREATE TRIGGER book_del AFTER DELETEON Book FOR EACH ROWBEGINDELETE FROM Sell WHERE 图书编号=OLD.图书编号;END$$DELIMITER ;

当触发器要触发的是表自身的更新操作时,只能使用BEFORE触发器,而AFTER触发器将不被允许。

4、在触发器中调用存储过程 

例:假设Bookstore数据库中有一个与Members表结构完全一样的表member_b,创建一个触发器,在Members表中添加数据的时候,调用存储过程,将member_b表中的数据与Members表同步。

1、定义存储过程:创建一个与Members表结构完全一样的表member_b 

DELIMITER $$CREATE PROCEDURE data_copy()BEGINREPLACE member_b SELECT * FROM Members;END$$

2、创建触发器:调用存储过程data_copy()

DELIMITER $$CREATE TRIGGER members_ins AFTER INSERTON Members FOR EACH ROWCALL data_copy();DELIMITER ;

5、删除触发器

语法格式:

DROP TRIGGER 触发器名

例:删除触发器members_ins

DROP TRIGGER members_ins;

以上就是MySQL中存储函数创建与触发器设置的方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/146262.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Redmi王腾回应因泄密被“下放”:开玩笑而已 轮岗是学习历练
上一篇 2025年12月2日 09:50:41
Trae入口_Trae官网登录入口2025
下一篇 2025年12月2日 09:50:43

相关推荐

  • CentOS7 MySQL怎么进行定时备份

    数据备份真的很重要, 因为可能有一天数据会被莫名其妙的删掉了. 本文将介绍如何在 CentOS 7 上使用 crontab 和 mysqldump 定时备份 mysql 的数据. 更换阿里源 # 备份 repo 文件cp /etc/yum.repos.d/CentOS-Base.repo /etc/…

    2026年9月4日
    000
  • 总结MySQL优化的最最基础操作

                                                                                    优化思路 详细的mysql优化步骤如下: 检查数据表结构,改善不完善设计跑一遍主要业务,收集常用的数据库查询SQL分析查询SQL,适当拆分,…

    用户投稿 2026年9月4日
    000
  • 168.7.1登录管理页面入口 192.168.7.1管理页面进入网址

    要进入192.168.7.1的管理页面,首先确保设备连接到该路由器的网络,然后在浏览器地址栏输入192.168.7.1并回车,接着输入正确的用户名和密码即可登录。1. 确保连接到正确的网络:设备必须通过网线或wi-fi连接到192.168.7.1对应的路由器,若使用移动数据或其他wi-fi则无法访问…

    2026年9月4日
    000
  • linux ubuntu怎么安装mysql

    linux ubuntu怎么安装mysqllinux ubuntu怎么安装mysqllinux ubuntu怎么安装mysqllinux ubuntu怎么安装mysql

    linux ubuntu安装mysql的方法:1、打开终端,更新软件包列表;2、通过“$ sudo apt-get install mysql-server mysql-client”安装MySQL;3、使用root账号登录即可。 本文操作环境:ubuntu 16.04系统、mysql8、Dell …

    2026年9月4日 用户投稿
    100
  • 如何设置谷歌浏览器主页 Chrome浏览器个性化配置详细教程

    设置chrome主页按钮:打开设置→外观→开启主页按钮并选择“新标签页”或输入自定义网址;2. 设置启动页:在设置→启动时选择“打开新标签页”“继续上次浏览”或“打开特定网页”;3. 主页是点击主页按钮跳转的页面,启动页是浏览器打开时自动加载的页面,两者功能独立;4. 个性化配置包括更换主题、调整字…

    2026年9月4日
    000
  • mysql时间怎么转换时间戳

    mysql时间转换时间戳的方法:1、通过“SELECT NOW();”获取当前时间;2、通过“SELECT UNIX_TIMESTAMP(NOW());”将时间日期格式转换成时间戳格式即可。 本文操作环境:Windows7系统、mysql8、Dell G3。 mysql时间怎么转换时间戳? MySQ…

    2026年9月4日
    000
  • mysql or用法是什么

    %ignore_a_1% or语法一般用于多个条件的查询,其使用语法如“SELECT * FROM WHERE p.`act_type` = 4 or p.`act_type` =…”。 本文操作环境:Windows7系统、mysql8、Dell G3。 mysql or用法是什么? M…

    2026年9月4日
    000
  • 如何用Java将MySQL企业、部门、职位数据转换为树形JSON结构?

    本文介绍如何使用Java将MySQL数据库中的企业、部门、职位数据转换为树形JSON结构。 目标是将数据库数据转换成如下所示的层级结构: [ { “code”: “c1”, “name”: “企业A”, “departments”: [ { “code”: “d1”, “name”: “财务部”, …

    2026年9月4日
    300
  • Sublime开发MySQL数据清洗自动脚本_批量规范字段格式与内容标准化

    Sublime开发MySQL数据清洗自动脚本_批量规范字段格式与内容标准化Sublime开发MySQL数据清洗自动脚本_批量规范字段格式与内容标准化Sublime开发MySQL数据清洗自动脚本_批量规范字段格式与内容标准化Sublime开发MySQL数据清洗自动脚本_批量规范字段格式与内容标准化

    处理mysql数据清洗问题可通过正则表达式、分批更新和标准化规则实现自动化。1. 使用regexp_replace函数清理格式,如去除电话中的非数字字符:update users set phone = regexp_replace(phone, ‘1’, ”);…

    2026年9月4日 用户投稿
    000
  • mysql的密码是什么

    mysql的密码是什么mysql的密码是什么mysql的密码是什么mysql的密码是什么

    mysql的默认密码为空,可以重新设置密码,其设置方法:1、用root用户名与密码登录数据库;2、通过“UPDATE user SET password=PASSWORD(“password”) WHERE…”语句修改密码即可。 本文操作环境:Windows7系统…

    2026年9月4日 用户投稿
    000
  • mysql 怎么修改时区

    mysql修改时区的方法:1、通过mysql命令行模式下动态修改;2、通过修改my.cnf配置文件来修改时区;3、通过php或其他语言在初始化mysql时初始化mysql时区。 本文操作环境:windows7系统、mysql8.0版、Dell G3电脑。 mysql 怎么修改时区? mysql修改时…

    2026年9月4日
    000
  • mysql和oracle有区别吗

    有区别,分别为:1、MySQL自动提交事务,Oracle手动提交;2、隔离级别上,MySQL是“read commited”,Oracle是“repeatable read”;3、MySQL是轻量型,且免费,而Oracle是重量型,且收费。 本教程操作环境:windows7系统、mysql8版本、D…

    2026年9月4日
    000
  • 解决SecureCRT下MySQL的中文乱码

    一、查看Linux主机系统字符集 命令: echo $lang [root@pythontab.com ~]# echo $LANG [root@pythontab.com ~]# en_US.UTF-8 查看是不是en_US,如果不是则可按照下面的方法修改: 1、直接设置变量的方式修改,命令如下两…

    用户投稿 2026年9月4日
    100
  • mysql怎么查询最后一条记录

    mysql查询最后一条记录的方法:1、查看当前数据库中的表及表结构;2、根据ID自增长,对ID字段进行倒序排序并查看第一行;3、根据当前insert语句并使用函数last_insert_id()查看最后一条记录即可。 本文操作环境:windows7系统、mysql8.0版、Dell G3电脑。 my…

    2026年9月4日
    000
  • 谷歌转化代码设置全攻略_谷歌广告转化跟踪代码的配置方法与技巧

    解决谷歌转化代码未触发问题需检查代码安装位置是否正确,确保全局代码位于所有页面标签内,事件代码置于转化发生页面或按钮的事件中;2. 确认代码未被修改或损坏;3. 清除浏览器与网站缓存排除缓存干扰;4. 检查是否存在javascript代码冲突;5. 核实转化规则设置与实际行为一致;6. 耐心等待数据…

    2026年9月4日
    000
  • mysql or和and有什么区别

    mysql or和and有什么区别mysql or和and有什么区别mysql or和and有什么区别mysql or和and有什么区别

    区别:1、本身含义上有差异,or指的是“或者”,and指的是“并且”;2、作用上有差异,and是必须满足所有条件,而or是满足一个条件即可。 本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。 我们查询数据的时候,会使用条件来过滤数据,达到筛选效果,过滤不要的数据,获取我们…

    2026年9月4日 用户投稿
    000
  • Linux文件系统目录结构详解

    大家好,又见面了,我是你们的朋友全栈君。 引言 对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解#%#$#%@%@%$#%$#%#%#$%@_e206a54e97690c++e50cc872dd70ee896文件目录结构的标准和每个目录的…

    2026年9月4日
    200
  • mysql怎么查询字段值

    mysql查询字段值的方法:1、使用“SELECT * FROM 表名;”语句,可以列出指定数据表中所有字段的值;2、使用“SELECT 字段名 FROM 表名;”语句,可以列出指定数据表中指定字段的值。 本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。 mysql查询字…

    2026年9月4日
    100
  • JPA 中如何格式化IDEA控制台打印的SQL语句?

    优化IDEA控制台JPA SQL打印输出 使用JPA时,启用show-sql: true可以在控制台查看执行的SQL语句。然而,默认输出为单行显示,可读性差。本文介绍如何格式化SQL输出,提升可读性。 关键在于Hibernate的hibernate.format_sql属性。默认值为false,导致…

    2026年9月4日
    100
  • 微信仅聊天和不让他看我有啥区别

    在微信的隐私设置中,“仅聊天”与“不让他(她)看我”是两个常被误解的功能选项。虽然它们都涉及隐私控制,但实际作用范围和使用场景存在明显差异。 “仅聊天”是一种较为严格的权限管理方式。启用该设置后,对方与你的互动将被限制在聊天界面之内。具体来说,此人无法浏览你的朋友圈、视频号动态、个人状态等公开信息。…

    2026年9月4日
    100

发表回复

登录后才能评论
关注微信