如何为mysql 5.5.44创建触发器?

时间:2016-06-18 10:14:20

标签: java mysql syntax-error mysql-5.5

{
  [CastError: Cast to ObjectId failed
    for value "26747261"
    at path "_id"
  ]
  message: 'Cast to ObjectId failed for value "26747261" at path "_id"',
    name: 'CastError',
    kind: 'ObjectId',
    value: 26747261,
    path: '_id',
    reason: undefined
}

上面是代码,它将为tableName和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);

在谷歌帮助之后我找到了这个帖子Error while creating trigger through JDBC on mysql5.5和文档http://dev.mysql.com/doc/refman/5.5/en/trigger-syntax.html,并且我已经将我的代码更改为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服务器版本,以便使用正确的语法   靠近' DELIMITER //创建TRIGGER reedswitchid_trigger在插入之前   ON ReedSwitches'在第1行。

我通过java执行此操作,MySQL服务器在Raspberry pi 2上。 有关更多信息评论和请注意,我是SQL的初学者。谢谢

编辑:

  

您的SQL语法有错误;检查与&gt;您的MySQL服务器版本相对应的手册,以便在&#39; SET&gt; new.lightsensor_topic = CONCAT附近使用正确的语法((SELECT device_topic FROM Devices WHERE&gt; devic&#39;在第1行。退出< / p>

            tableCreation.append("CREATE TABLE " + tableName);
            tableCreation.append("(");
            tableCreation.append(tablelower + "_currentid INT PRIMARY KEY AUTO_INCREMENT,");
            tableCreation.append(tablelower + "_id VARCHAR(10) NOT NULL,");
            tableCreation.append(tablelower + "_name VARCHAR(45) NOT NULL,");
            tableCreation.append(tablelower + "_type VARCHAR(45) NOT NULL,");
            tableCreation.append(tablelower + "_topic  VARCHAR(255) NOT NULL,");
            tableCreation.append(tablelower + "_pin VARCHAR(6) NOT NULL,");
            tableCreation.append(tablelower + "_device VARCHAR(100) NOT NULL,");
            tableCreation.append(tablelower + "_device_id INT NOT NULL,");
            tableCreation.append("FOREIGN KEY(" + tablelower + "_device_id) REFERENCES Devices(device_currentid)");
            tableCreation.append(" ); ");

            tableCreation.append("DELIMITER // ");
            tableCreation.append(" CREATE");
            tableCreation.append(" TRIGGER " + tablelower + "id_trigger ");
            tableCreation.append(" BEFORE INSERT");
            tableCreation.append(" ON " + tableName + " FOR EACH ROW");
            tableCreation.append(" BEGIN");
            tableCreation.append(" SET new." + tablelower + "_id = CONCAT('" + topic + "',LPAD((SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = '" + tableName + "'),4,'0'));");
            tableCreation.append(" SET new." + tablelower + "_topic = CONCAT((SELECT device_topic FROM Devices WHERE device_name LIKE new." + tablelower + "_device),'/',(new." + tablelower + "_id));");
            tableCreation.append(" END;//");
            tableCreation.append("DELIMITER ; ");

            mysqlconn.createStatement().execute(tableCreation.toString());

1 个答案:

答案 0 :(得分:0)

JDBC Stateent #cuteXXX方法用于执行单个 SQL语句,而不是一次执行多个语句。
即使某些数据库/驱动程序实现允许这样做,这是一种非标准的方式,并且它不便携,所以根本不使用它。

将您的代码分为两个语句:

String s1 = "CREATE TABLE ( ....... )";
String s2 = "CREATE TRIGGER .......END";
 mysqlconn.createStatement().execute( s1 );
 mysqlconn.createStatement().execute( s2 );

两个重要的注释:

  • 在JDBC中的SQL命令末尾不要使用分号;
  • 不要使用DELIMITER x命令 - 它不是SQL命令,而是mysql-client命令,数据库没有重新识别它