2017-03-16 10 views
1

私は多くのSOスレッド(one of them here)をチェックしましたが、問題のある場所が見つかりませんでした。mysqlはトリガー構文エラーを作成します

ヌルでない場合は、this threadに続いて、列が更新されないように保護しようとしています。

しかし、私はmysqlから構文エラーが発生しています。ここに私のコードです:あなたはエラーコードですSQLSTATEを指定する必要があり、利用者のための一般的なエラーコードを定義しSIGNAL経由してエラーを発生させるために、しようとすると

DELIMITER $$ 

CREATE TRIGGER lock_x_id 
BEFORE UPDATE ON Games 
FOR EACH ROW BEGIN 
    IF (old.xid IS NOT NULL) THEN 
    SIGNAL 'error'; 
    END IF; 
END$$ 

DELIMITER ; 
+0

このエラーは何ですか? –

+0

ERROR 1064(42000):SQL構文にエラーがあります。あなたのMySQLサーバのバージョンに対応するマニュアルを見て、正しい構文が "エラー"の近くで使用できるようにしてください。 –

答えて

2

その45000メッセージテキストMESSAGE_TEXT

と一緒にだから、トリガーは

delimiter // 
create trigger lock_x_id before update on games 
for each row 
begin 
if old.xid is not null then 
    signal SQLSTATE VALUE '45000' SET MESSAGE_TEXT = 'Your custom error message'; 
end if; 
end;// 
delimiter ; 

テストケース

ようになります
mysql> select * from games; 
+----+------+------+ 
| id | xid | val | 
+----+------+------+ 
| 1 | NULL | 1 | 
| 2 | NULL | 2 | 
| 3 | NULL | 3 | 
| 4 | 1 | 4 | 
| 5 | 2 | 5 | 
+----+------+------+ 

mysql> delimiter // 
mysql> create trigger lock_x_id before update on games 
    -> for each row 
    -> begin 
    -> if old.xid is not null then 
    -> signal SQLSTATE VALUE '45000' SET MESSAGE_TEXT = 'Your custom error message'; 
    -> end if; 
    -> end;// 
Query OK, 0 rows affected (0.05 sec) 


mysql> update games set xid = 4 where id = 1; 
Query OK, 1 row affected (0.06 sec) 
Rows matched: 1 Changed: 1 Warnings: 0 

mysql> update games set xid = 5 where id=5; 
ERROR 1644 (45000): Your custom error message 

そして、上記2アップデートは、テーブルが2回目の更新が失敗し、行が変更されていないこと

mysql> select * from games; 
+----+------+------+ 
| id | xid | val | 
+----+------+------+ 
| 1 | 4 | 1 | 
| 2 | NULL | 2 | 
| 3 | NULL | 3 | 
| 4 | 1 | 4 | 
| 5 | 2 | 5 | 
+----+------+------+ 

注意をどのように見えるかをここでコマンドを実行した後にトリガーを作成することができます。

続きを読むhttps://dev.mysql.com/doc/refman/5.5/en/signal.html

+0

は完璧に機能します!バグが私にとって唯一のことは、私が 'デリミタ 'を設定しないようにすることです。しかし、あまりにもありがとう! –

+1

node.jsで 'sequelize'を使うと、トリガーコードを指定する必要があり、ライブラリが扱う'デリミタ 'を指定する必要はありません。区切り文字は、CLIで実行するときに必要です。 'sequelize.query(/ * trigger code * /)'また、更新前のイベントを処理するためにフックを使用することもできます。http://docs.sequelizejs.com/en/latest/docs/hooks/ –

+1

?!それでおしまい!私は十分にあなたに感謝できません! –

関連する問題