mysql:通过JDBC接口执行创建触发器的SQL语句
delimiter
以下是从mysql官方文档《23.3.1 Trigger Syntax and Examples》抄来的一段创建触发器的SQL脚本,
delimiter //
CREATE TRIGGER upd_check BEFORE UPDATE ON account
FOR EACH ROW
BEGINIF NEW.amount < 0 THENSET NEW.amount = 0;ELSEIF NEW.amount > 100 THENSET 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
相关的语句就可以了
CREATE TRIGGER upd_check BEFORE UPDATE ON account
FOR EACH ROW
BEGINIF NEW.amount < 0 THENSET NEW.amount = 0;ELSEIF NEW.amount > 100 THENSET NEW.amount = 100;END IF;
END;
allowMultiQueries
有的时候需要反复执行触发器创建命令,为了确保创建触发器成功,在执行CRETAE TRIGGER
语句之前,要先执行DROP TRIGGER
命令删除已有的同名触发器,如下:
DROP TRIGGER IF EXISTS upd_check ;
CREATE TRIGGER upd_check BEFORE UPDATE ON account
FOR EACH ROW
BEGINIF NEW.amount < 0 THENSET NEW.amount = 0;ELSEIF NEW.amount > 100 THENSET 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连接方法,示例代码如下:
/*** 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》
mysql:通过JDBC接口执行创建触发器的SQL语句相关推荐
- mysql查询低效语句_MySQL数据库中查找执行从命慢的SQL语句
MySQL数据库中查找执行从命慢的SQL语句 (2011-09-15 08:21:35) 标签: 杂谈 去历:赛迪网 做者:Alizze 启动Mysql时减参数--log-slow-queries去挤 ...
- 【spring】spring JDBC开发 、 将创建表生成sql语句的方法
将navicate中已存在表的创建转化成sql语句的方法 1.右击表,选择对象信息 2.点击DDL jar包引入 1.spring-starter-jdbc 代码实现: <dependency& ...
- mysql创建用户表的sql语句,mysql创建表的sql语句
mysql 动态sql语句,如何用一款小工具大大加速MySQL SQL语句优化(附源,mysql分页查询sql语句,mysql创建表的sql语句 mysql建表语句_计算机软件及应用_IT/计算机_专 ...
- 在Hive中执行DDL之类的SQL语句时遇到的一个问题
在Hive中执行DDL之类的SQL语句时遇到的一个问题 作者:天齐 遇到的问题如下: hive> create table ehr_base(id string); FAILED: Execut ...
- 原生sql 查询返回一个实体_python连接SQLServer执行给定的查询SQL语句,并返回结果数据...
今天写这篇文章的初衷就是在我昨天发表的文章<Python连接SQLServer数据库执行增删改查操作>后,一些读者反馈说跟Python完全没有关系,这里我想说的是:内容的确是与Python ...
- oracle中子查询的执行顺序是,Oracle sql语句执行顺序
sql语法的分析是从右到左 一.sql语句的执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. ...
- 创建索引的sql语句是什么
创建索引的sql语句是[CREATE INDEX indexName ON table_name (column_name)],这是最基本的索引,它没有任何限制. 本文操作环境:windows10系统 ...
- oracle 根据spid查sql,探讨:Oracle数据库查看一个进程是如何执行相关的实际SQL语句...
Oracle数据库查看一个进程是如何执行相关的实际sql语句 代码如下: SELECT b.sql_text,sid,serial#,osuser,machine FROM v$session a,v ...
- 数据库创建(利用写好的数据库表生成创建表的sql语句+利用生成的数据库创建表加同步数据sql)
一.利用写好的数据库表生成创建表的sql语句 1.简单创建一个数据库,并建一个表,并编辑数据. a.建库 b.建表 c.编辑表,保存时输入表名 d.刷新一下,出来了 e.转存导出sql文件. 二.利用 ...
最新文章
- TensorFlow学习笔记——实现经典LeNet5模型
- ibm linux mq 发送消息_RabbitMq、ActiveMq、Kafka和Redis做Mq对比
- 腾讯“死守”版权,网易云“再强”社区,各筑“孤峰”对战在线音乐下半场
- 【Python】从0开始写爬虫——扒狗东先流产了
- android 多个语音合成,android实现语音合成
- PHP递归遍历数组 不破坏数据结构 替换字符
- ArcGIS API for Silverlight 使用GeometryService进行河流网格划分(三)
- oracle获取当前年上一年时间,Oracle获取一年中的所有日期和一个月中的所有日期...
- C语言字母O和数字0怎么区分,车牌数字“0”和字母“O”究竟如何区分?看完终于弄明白了...
- 16qam matlab 误码率,16QAM理论误码率与实际误码率MATLAB仿真程序
- 写博客一年多的一些感想
- 苹果App签名工具有哪些?
- (转)人工智能公司Kensho是如何改变华尔街的?
- %02x与%2x 区别
- ArcGIS For Unity3D(一)—— 在Unity3D中开启ArcGIS
- 【Jupyter Notebook】添加目录--Table of Contents
- RANSAC算法(仅供学习使用)
- 计算机和语言学的交叉,计算语言学与传统语言学的区别
- 8.7k Star!不剁手 Mac 也能用 macOS
- 222. 解决error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/d
热门文章
- [已解决] Google Drive 下载文件超出下载限额
- 山东大学RISCV公共开放平台
- 联想网御 多网多口DMZ
- tortiese svn clean uo失败
- 在idea中连接Linux的mysql数据库(我的一生之敌防火墙)
- matlab norm如何理解,MATLAB 中NORM运用
- Redis 5 集群扩容、缩容详解
- NKOJ 2182 (HEOI 2012) 采花(树状数组/线段树)
- Truthful Double Spectrum Auction (TDSA)
- 慕课嵌入式系统(第九章.ucos-ii操作系统实验)