Java 如何为mysql 5.5.44创建触发器?
上面的代码将生成一个表和一个触发器,表名和tablelower都是字符串变量。这是我写的第一个版本,错误如下:Java 如何为mysql 5.5.44创建触发器?,java,mysql,syntax-error,mysql-5.5,Java,Mysql,Syntax Error,Mysql 5.5,上面的代码将生成一个表和一个触发器,表名和tablelower都是字符串变量。这是我写的第一个版本,错误如下: s = "CREATE TABLE " + tableName +"\n" + "(\n" + " " + tablelower + "_currentid INT PRIMARY KEY AUTO_INCREMENT,\n" + " " + tablelower + "_id VARCHAR(8) NOT NULL,\n" + " "
s = "CREATE TABLE " + tableName +"\n" +
"(\n" +
" " + tablelower + "_currentid INT PRIMARY KEY AUTO_INCREMENT,\n" +
" " + tablelower + "_id VARCHAR(8) NOT NULL,\n" +
" " + tablelower + "_name VARCHAR(45) NOT NULL,\n" +
" " + tablelower + "_type VARCHAR(45) NOT NULL,\n" +
" " + tablelower + "_topic VARCHAR(255) NOT NULL,\n" +
" " + tablelower + "_pin VARCHAR(6) NOT NULL,\n" +
" " + tablelower + "_device VARCHAR(100) NOT NULL,\n" +
" " + tablelower + "_device_id INT NOT NULL,\n" +
" FOREIGN KEY(" + tablelower + "_device_id) REFERENCES Devices(device_currentid)\n" +
");\n" +
"\n" +
" delimiter | \n" +
" CREATE TRIGGER " + tablelower + "_trigger BEFORE INSERT ON " + tableName +
" FOR EACH ROW\n" +
" BEGIN\n" +
" SET new." + tablelower + "_id = CONCAT('" + topic + "',LPAD((SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = '" + tableName + "'),4,'0'));\n" +
" SET new." + tablelower + "_topic = CONCAT((SELECT device_topic FROM Devices WHERE device_name LIKE new." + tablelower + "_device),'/',(new." + tablelower + "_id));\n" +
" END;\n" +
" | \n" +
" delimiter ;";
mysqlconn.createStatement().execute(s);
在google帮助之后,我找到了这个线程和文档,并将我的代码更改为StringBuilder,如下所示:
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 |
CREATE TRIGGER tablename_trigger BEFORE INSERT ON tablename FO' at line 14
但在这些更改之后,我仍然得到以下错误:
您的SQL语法有错误;检查手册
对应于您的MySQL服务器版本,以便使用正确的语法
near'分隔符//插入前创建触发器reedswitchid\u触发器
在1号线的簧片开关上
我是通过java执行的,MySQL服务器在Raspberry pi 2上。
如需更多信息,请评论并注意,我是SQL的初学者。谢谢
编辑:
您的SQL语法有错误;检查对应于>您的MySQL服务器版本的手册,了解要在第1行的“设置>新建.lightsensor\u topic=CONCATSELECT device\u topic FROM Devices WHERE>devic”中使用的正确语法。退出
JDBC StateentexecuteXXX方法旨在执行单个SQL语句,而不是一次执行多个语句。 即使某些数据库/驱动程序实现允许这样做,但这是一种非标准的方式,并且不可移植,所以不要使用它。 将代码分为两条语句:
tabl = "CREATE TABLE " + tableName +
"(" + " " + tablelower + "_currentid INT PRIMARY KEY AUTO_INCREMENT, " +
tablelower + "_id VARCHAR(8) NOT NULL, " +
tablelower + "_name VARCHAR(45) NOT NULL, " +
tablelower + "_type VARCHAR(45) NOT NULL, " +
tablelower + "_topic VARCHAR(255) NOT NULL, " +
tablelower + "_pin VARCHAR(6) NOT NULL, " +
tablelower + "_device VARCHAR(100) NOT NULL, " +
tablelower + "_device_id INT NOT NULL, " +
"FOREIGN KEY(" + tablelower + "_device_id) REFERENCES Devices(device_currentid)" +
")";
trigg=
" CREATE TRIGGER " + tablelower + "_trigger BEFORE INSERT ON " + tableName +
" FOR EACH ROW" +
" SET new." + tablelower + "_id = CONCAT('" + topic + "',LPAD((SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = '" + tableName + "'),4,'0'))" +
" SET new." + tablelower + "_topic = CONCAT((SELECT device_topic FROM Devices WHERE device_name LIKE new." + tablelower + "_device),'/',(new." + tablelower + "_id))" +
" END";
mysqlconn = data.getConnection();
mysqlconn.createStatement().execute(tabl);
mysqlconn.createStatement().execute(trigg);
两个重要注意事项:
不要使用分号;在JDBC中SQL命令的末尾
不要使用分隔符x命令-它不是SQL命令,而是mysql客户机命令,数据库不会识别它
JDBC StateentexecuteXXX方法旨在执行单个SQL语句,而不是一次执行多个语句。 即使某些数据库/驱动程序实现允许这样做,但这是一种非标准的方式,并且不可移植,所以不要使用它。 将代码分为两条语句:
tabl = "CREATE TABLE " + tableName +
"(" + " " + tablelower + "_currentid INT PRIMARY KEY AUTO_INCREMENT, " +
tablelower + "_id VARCHAR(8) NOT NULL, " +
tablelower + "_name VARCHAR(45) NOT NULL, " +
tablelower + "_type VARCHAR(45) NOT NULL, " +
tablelower + "_topic VARCHAR(255) NOT NULL, " +
tablelower + "_pin VARCHAR(6) NOT NULL, " +
tablelower + "_device VARCHAR(100) NOT NULL, " +
tablelower + "_device_id INT NOT NULL, " +
"FOREIGN KEY(" + tablelower + "_device_id) REFERENCES Devices(device_currentid)" +
")";
trigg=
" CREATE TRIGGER " + tablelower + "_trigger BEFORE INSERT ON " + tableName +
" FOR EACH ROW" +
" SET new." + tablelower + "_id = CONCAT('" + topic + "',LPAD((SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = '" + tableName + "'),4,'0'))" +
" SET new." + tablelower + "_topic = CONCAT((SELECT device_topic FROM Devices WHERE device_name LIKE new." + tablelower + "_device),'/',(new." + tablelower + "_id))" +
" END";
mysqlconn = data.getConnection();
mysqlconn.createStatement().execute(tabl);
mysqlconn.createStatement().execute(trigg);
两个重要注意事项:
不要使用分号;在JDBC中SQL命令的末尾
不要使用分隔符x命令-它不是SQL命令,而是mysql客户机命令,数据库不会识别它
String s1 = "CREATE TABLE ( ....... )";
String s2 = "CREATE TRIGGER .......END";
mysqlconn.createStatement().execute( s1 );
mysqlconn.createStatement().execute( s2 );