Java 如何为mysql 5.5.44创建触发器?

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" + " "

上面的代码将生成一个表和一个触发器,表名和tablelower都是字符串变量。这是我写的第一个版本,错误如下:

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 );