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语句相关推荐

  1. mysql查询低效语句_MySQL数据库中查找执行从命慢的SQL语句

    MySQL数据库中查找执行从命慢的SQL语句 (2011-09-15 08:21:35) 标签: 杂谈 去历:赛迪网 做者:Alizze 启动Mysql时减参数--log-slow-queries去挤 ...

  2. 【spring】spring JDBC开发 、 将创建表生成sql语句的方法

    将navicate中已存在表的创建转化成sql语句的方法 1.右击表,选择对象信息 2.点击DDL jar包引入 1.spring-starter-jdbc 代码实现: <dependency& ...

  3. mysql创建用户表的sql语句,mysql创建表的sql语句

    mysql 动态sql语句,如何用一款小工具大大加速MySQL SQL语句优化(附源,mysql分页查询sql语句,mysql创建表的sql语句 mysql建表语句_计算机软件及应用_IT/计算机_专 ...

  4. 在Hive中执行DDL之类的SQL语句时遇到的一个问题

    在Hive中执行DDL之类的SQL语句时遇到的一个问题 作者:天齐 遇到的问题如下: hive> create table ehr_base(id string); FAILED: Execut ...

  5. 原生sql 查询返回一个实体_python连接SQLServer执行给定的查询SQL语句,并返回结果数据...

    今天写这篇文章的初衷就是在我昨天发表的文章<Python连接SQLServer数据库执行增删改查操作>后,一些读者反馈说跟Python完全没有关系,这里我想说的是:内容的确是与Python ...

  6. oracle中子查询的执行顺序是,Oracle sql语句执行顺序

    sql语法的分析是从右到左 一.sql语句的执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. ...

  7. 创建索引的sql语句是什么

    创建索引的sql语句是[CREATE INDEX indexName ON table_name (column_name)],这是最基本的索引,它没有任何限制. 本文操作环境:windows10系统 ...

  8. oracle 根据spid查sql,探讨:Oracle数据库查看一个进程是如何执行相关的实际SQL语句...

    Oracle数据库查看一个进程是如何执行相关的实际sql语句 代码如下: SELECT b.sql_text,sid,serial#,osuser,machine FROM v$session a,v ...

  9. 数据库创建(利用写好的数据库表生成创建表的sql语句+利用生成的数据库创建表加同步数据sql)

    一.利用写好的数据库表生成创建表的sql语句 1.简单创建一个数据库,并建一个表,并编辑数据. a.建库 b.建表 c.编辑表,保存时输入表名 d.刷新一下,出来了 e.转存导出sql文件. 二.利用 ...

最新文章

  1. TensorFlow学习笔记——实现经典LeNet5模型
  2. ibm linux mq 发送消息_RabbitMq、ActiveMq、Kafka和Redis做Mq对比
  3. 腾讯“死守”版权,网易云“再强”社区,各筑“孤峰”对战在线音乐下半场
  4. 【Python】从0开始写爬虫——扒狗东先流产了
  5. android 多个语音合成,android实现语音合成
  6. PHP递归遍历数组 不破坏数据结构 替换字符
  7. ArcGIS API for Silverlight 使用GeometryService进行河流网格划分(三)
  8. oracle获取当前年上一年时间,Oracle获取一年中的所有日期和一个月中的所有日期...
  9. C语言字母O和数字0怎么区分,车牌数字“0”和字母“O”究竟如何区分?看完终于弄明白了...
  10. 16qam matlab 误码率,16QAM理论误码率与实际误码率MATLAB仿真程序
  11. 写博客一年多的一些感想
  12. 苹果App签名工具有哪些?
  13. (转)人工智能公司Kensho是如何改变华尔街的?
  14. %02x与%2x 区别
  15. ArcGIS For Unity3D(一)—— 在Unity3D中开启ArcGIS
  16. 【Jupyter Notebook】添加目录--Table of Contents
  17. RANSAC算法(仅供学习使用)
  18. 计算机和语言学的交叉,计算语言学与传统语言学的区别
  19. 8.7k Star!不剁手 Mac 也能用 macOS
  20. 222. 解决error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/d

热门文章

  1. [已解决] Google Drive 下载文件超出下载限额
  2. 山东大学RISCV公共开放平台
  3. 联想网御 多网多口DMZ
  4. tortiese svn clean uo失败
  5. 在idea中连接Linux的mysql数据库(我的一生之敌防火墙)
  6. matlab norm如何理解,MATLAB 中NORM运用
  7. Redis 5 集群扩容、缩容详解
  8. NKOJ 2182 (HEOI 2012) 采花(树状数组/线段树)
  9. Truthful Double Spectrum Auction (TDSA)
  10. 慕课嵌入式系统(第九章.ucos-ii操作系统实验)