2

InnoDBを使用してMySQL5.5.28で複数の操作を実行するトリガーを作成しようとしています。

「test」と「test_watcher」の2つのテーブルがあります。最初のテーブルへの変更は、トリガーを使用してウォッチャーテーブルに記録されます。最後のトリガーはで2つの操作を実行する必要があります。これDELETEは、MySQL Workbench(を使用DELIMITER)で機能しますが、JDBCを使用して作成した場合は機能しません。

CREATE TRIGGER `AD_test_FER` AFTER DELETE
  ON `test`
  FOR EACH ROW
      BEGIN
        -- if it's been inserted, modified and deleted but never synced, 
        -- the revision is NULL: no one needs to know about it
        DELETE FROM test_watcher WHERE pk = OLD.id AND revision IS NULL;

        -- if it has been synced already, we just update the flag
        UPDATE test_watcher SET flag = -1 WHERE pk = OLD.id;
      END;

私は取得し続けcom.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntaxます。

Workbenchで動作することは知ってDELIMITER $$いますが、JDBCはサポートしていません。

私はPostgreSQLでそれを達成し、必要に応じてコードを投稿します。

4

2 に答える 2

2

JDBC が区切り文字をサポートしていない場合 (DELIMITER はクライアント コマンド)、これら 2 つのステートメントを個別に (1 つずつ) 実行します。

于 2013-01-31T10:21:32.193 に答える
2

この動作は、接続プロパティ allowMultiQueries=trueが原因である可能性があります。私の推測では、このプロパティにより、MySQL;はクエリ セパレーターとしてクエリを分割し、それらを個別のクエリとして実行し、本質的にトリガー作成コードを壊します。

あなたが - 今は削除された - 答えで言ったように、追加することでallowMultiQueries=true実際に問題が解決した(私の期待に反して)、問題は実際には;クエリの最後にあるかもしれません。したがって、チェックするもう1つのことは、スクリプトの最後の;(in )を削除する(およびを使用しない)ことで問題が解決するかどうかです。一部のデータベースは、ステートメントの最後で有効であるとは見なしません(実際にはステートメントを区切るための区切り文字であるため)。END;allowMultiQueries=true;

(この回答は、上記の私のコメントに基づいています)

于 2013-01-31T12:31:45.873 に答える