Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >mysql:通过JDBC接口执行创建触发器的SQL语句

mysql:通过JDBC接口执行创建触发器的SQL语句

作者头像
10km
发布于 2022-04-13 04:37:55
发布于 2022-04-13 04:37:55
2.2K00
代码可运行
举报
文章被收录于专栏:10km的专栏10km的专栏
运行总次数:0
代码可运行

delimiter

以下是从mysql官方文档《23.3.1 Trigger Syntax and Examples》抄来的一段创建触发器的SQL脚本,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
delimiter //
CREATE TRIGGER upd_check BEFORE UPDATE ON account
FOR EACH ROW
BEGIN
    IF NEW.amount < 0 THEN
        SET NEW.amount = 0;
    ELSEIF NEW.amount > 100 THEN
        SET NEW.amount = 100;
    END IF;
END;//
delimiter ;

这个脚本在MySQL 终端(MySQL console)或Workbench工作正常。但当我通过JDBC接口执行这段SQL代码时报错了

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'delimiter //

原因是因为delimiter关键字不是SQL标准的一部分,只在Mysql Console有效

所以只要删除delimiter相关的语句就可以了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TRIGGER upd_check BEFORE UPDATE ON account
FOR EACH ROW
BEGIN
    IF NEW.amount < 0 THEN
        SET NEW.amount = 0;
    ELSEIF NEW.amount > 100 THEN
        SET NEW.amount = 100;
    END IF;
END;

allowMultiQueries

有的时候需要反复执行触发器创建命令,为了确保创建触发器成功,在执行CRETAE TRIGGER语句之前,要先执行DROP TRIGGER命令删除已有的同名触发器,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DROP TRIGGER IF EXISTS upd_check ;
CREATE TRIGGER upd_check BEFORE UPDATE ON account
FOR EACH ROW
BEGIN
    IF NEW.amount < 0 THEN
        SET NEW.amount = 0;
    ELSEIF NEW.amount > 100 THEN
        SET NEW.amount = 100;
    END IF;
END;

通过JCBC接口执行又会报错:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CREATE TRIGGER upd_check BEFORE UPDATE ON account

这是因为MySQL 的 JDBC 连接器有一个名为allowMultiQueries 的安全特性,默认为false[关闭]. 关闭时,不允许一次执行多个SQL语句。

所以要在数据库的连接url中添加&allowMultiQueries=true就可以解决此问题。 如果不希望修改数据连接URL,而且直接JDBC连接数据库,可以调用Connection java.sql.DriverManager.getConnection(String url, Properties info) throws SQLException方法,将allowMultiQueries通过Properties对象传递给JDBC连接方法,示例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	/**
	 * JDBC接口执行SQL脚本
	 * @param sql SQL代码
	 * @throws SQLException
	 */
	public void runSQL(String sql) throws SQLException{
		Connection connection = null;
		Statement stat = null;
		try {
			String url = "jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useInformationSchema=true";//&allowMultiQueries=true
			// 加载并注册MySQL的JDBC驱动
			Class<?> driverClass = Class.forName("com.mysql.jdbc.Driver");
			DriverManager.registerDriver(Driver.class.cast(driverClass.newInstance()));
			Properties info=new Properties();
			// 设置连接用户名
			info.put("user", "root");
			// 设置允许执行多条SQL语句
			info.put("allowMultiQueries","true");
			connection = DriverManager.getConnection(url, info);
			System.out.printf("sql string:\n" + sql + "\n");
			stat = connection.createStatement();
			stat.executeUpdate(sql);			

		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(null != stat)
			{
				stat.close();
			}
			if(null != connection){
				connection.close();
			}
		}
		
	}

参考资料

《23.3.1 Trigger Syntax and Examples》 《Error while creating trigger through JDBC on mysql5.5》 《6.3.5 Security》 《allowMultiQueries flag with JDBC and jOOQ》

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/03/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【说站】mysql触发器的缺陷分析
mysql触发器的缺陷分析 说明 1、使用触发器实现的业务逻辑在出现问题时很难定位。 尤其是涉及多个触发器时,会使后期维护困难。 2、大量使用触发器容易导致代码结构混乱。 增加程序的复杂性。 3、如果需要更改的数据量大,触发器的执行效率会很低。 4、触发器的隐式调用容易被忽视。 很难排查问题。 实例 # 创建表 创建触发器 mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2)); Query OK, 0 rows affected
很酷的站长
2022/11/24
9830
【说站】mysql触发器的缺陷分析
MySQL触发器介绍
在学习 MySQL 的过程中,可能你了解过触发器的概念,不清楚各位是否有详细的去学习过触发器,最近看了几篇关于触发器的文档,分享下 MySQL 触发器相关知识。
MySQL技术
2021/08/24
4.2K0
深入理解MySQL触发器
触发器(trigger)是数据库中的一个很重要的、很实用的基于事件的处理器,在处理一些业务需求的时候,使用触发器会很方便。似乎在《高性能MySQL》中,对触发器作了一定的描述,也提到使用中的一些优势和局限性,但感觉还是不能完全理解触发器的全部功能和实现。于是自己在网上看了一些文章,结合官网(https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html)中的案例,写下这篇总结。
星哥玩云
2022/08/18
8680
深入理解MySQL触发器
MySQL触发器了解一下
触发器是与表有关的数据库对象,当表发生INSERT/UPDATE/DELETE操作时,对应操作的触发器会被触发,将在这些操作之前或之后执行触发器中定义的SQL语句集合。
布禾
2021/04/15
8070
mysql触发器的作用及语法 转
触发器是一种特殊的存储过程,它在插入,删除或改动特定表中的数据时触发运行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。
双面人
2019/04/10
3.6K0
executeupdate mysql_使用Mysql中的executeUpdate在SQL语句中创建表
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
全栈程序员站长
2022/11/01
6.9K0
java jdbc使用与源码分析
jdbc的基本使用 public static void main(String[] args) throws ClassNotFoundException, SQLException { Str
东营浪人
2022/05/06
4080
MariaDB 视图与触发器
数据库中的视图是一个虚拟表,同真实的表一样,视图包含一系列带有名称的行和列数据,行和列数据来自由定义视图查询所引用的表,并且在引用视图时动态生成,视图是从一个或者多个表中导出的,视图的行为与表非常相似,但视图是一个虚拟表.在视图中用户可以使用SELECT语句查询数据,以及使用INSERT、UPDATE和DELETE修改记录,视图可以使用户操作方便,而且可以保障数据库系统的安全.
王 瑞
2022/12/28
1.3K0
因mysql表名与mysql关键字冲突导致的com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException
最近在使用activiti实战中的代码,将ORM框架由hibernate换成了mybatis,在使用第7章的请假实例时,插入mysql数据库出现了com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException错误,找了半天最终发现使用了mysql的预留关键字leave,修改leave表格名字后一切正常,真是一次崎岖的bug之旅,故记录下来,希望帮到遇到相同问题的人!
johnhuster的分享
2022/03/29
4420
《MySQL核心知识》第12章:触发器
今天是《MySQL核心知识》专栏的第12章,今天为大家系统的讲讲MySQL中的触发器,希望通过本章节的学习,小伙伴们能够举一反三,彻底掌握MySQL中的触发器知识。好了,开始今天的正题吧。
冰河
2022/12/01
4290
《MySQL核心知识》第12章:触发器
【Java】已解决Java中的com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException异常
在Java中操作MySQL数据库时,我们经常会使用JDBC(Java Database Connectivity)技术。然而,有时在编写SQL语句或操作数据库时,可能会遇到com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException异常。这个异常通常表示我们发送给MySQL服务器的SQL语句存在语法错误。
屿小夏
2024/06/19
7680
[1219]mysql自定义函数split_part、split_last
关键字delimiter的使用: delimiter是mysql分隔符。在mysqlclient中分隔符默认是分号(;)。 假设一次输入的语句较多,而且语句中间有分号,这时须要新指定一个特殊的分隔符。 在前一篇中有设置mysql的触发器时使用样例
周小董
2023/10/10
8860
[1219]mysql自定义函数split_part、split_last
SQL简介
注意:insert 只有new,delete 只有old ,oracle 自动添加id
Dean0731
2020/05/11
3K0
JDBC(MySQL)一周学习总结(一)
一周过去了,我在这分享一下这一周来学习 JDBC 的知识,同时也希望可以帮到别人! 首先我们从获取 JDBC 连接开始 Driver(每个驱动程序类必须实现的接口) 获取数据库连接需要配置数据库连接信息,DriverClass 表示数据库驱动,user 表示数据库登录用户名,passWord 表示登录密码,url 用于标识一个被注册的驱动程序,驱动程序管理器通过 URL 选择正确的驱动程序,从而建立数据库连接 Oracle URL:jdbc:oracle:thin:@localhost:1521:数据库名
bgZyy
2018/05/16
1.7K0
MySQL触发器案例分析及before与after的区别
触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,例如当对一个表进行操作( insert,delete, update)时就会激活它执行。
星哥玩云
2022/08/16
3.3K0
MySQL技能完整学习列表8、触发器、视图和事务——1、触发器(Triggers)的使用——2、视图(Views)的创建和使用——3、事务(Transactions)的管理
MySQL的触发器(Triggers)是一种特殊类型的存储过程,它会在数据表上的特定操作(插入、更新或删除)发生时自动执行。触发器可以帮助我们实现数据的自动处理、验证和维护等任务。下面将详细说明MySQL触发器的使用方法,并提供具体的示例。
红目香薰
2023/12/01
7320
Mysql高级8-触发器
  触发器是与表有关的数据库对象,指在insert/update/delete之前或者之后,触发并执行触发器中定义的sql语句集合,触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。
Se7eN_HOU
2023/08/17
3590
Mysql触发器
数据库中除了需要定时完成一些任务外,有时我们也想在某些表数据变化时自动执行些操作,这就要用到触发器了
码客说
2019/10/22
5K0
使用PreparedStatement执行sql语句
抽取jdbc获取Connection对象和关闭Connection对象和Statement对象的工具类
全栈程序员站长
2022/09/07
1.8K0
Jdbc源码详解(一):示例+Driver注册流程
0x00 前言 写在前面 问题一: 你是否曾经好奇在使用jdbc的时候为什么要写这行代码:Class.forName("com.mysql.jdbc.Driver"); 问题二: 你是否经常遇到ClassNotFoundException异常,然后仅仅是百度一下找到答案就不再关注? 问题三: 你是否在项目中用了三到五年的jdbc程序,但是仍然没有看过它的实现原理? 问题四: 你是否想好好阅读一份源码,但是一直没有开始? 如果上面说到的几个问题你有遇到过,那么你可以继续阅读下面的内容了
木东居士
2018/05/25
2.5K0
相关推荐
【说站】mysql触发器的缺陷分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档