前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql:通过JDBC接口执行创建触发器的SQL语句

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

作者头像
10km
发布2022-04-13 12:37:55
1.9K0
发布2022-04-13 12:37:55
举报
文章被收录于专栏:10km的专栏10km的专栏

delimiter

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

代码语言:javascript
复制
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
复制
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
复制
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
复制
	/**
	 * 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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • delimiter
  • allowMultiQueries
  • 参考资料
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档