2017-11-28 5 views
0

私はMySQLクエリを書こうとしています。 select関数のWITH節に何らかのエラーが発生しています。MySQLトリガで "WITH"句を使用するには?

これはサンプルクエリです:

CREATE TRIGGER SAMPLE BEFORE INSERT ON SERVER 
    FOR EACH ROW 
    BEGIN 
    IF ((SELECT COUNT(S.ID) FROM SERVER S WITH UR) >= (SELECT L.SERVERS FROM SAMPLE L WHERE L.ID = 1 LIMIT 1)) THEN 
     SIGNAL SQLSTATE '73550' SET MESSAGE_TEXT='+ID'; 
    END IF; 
    END; 

と私はエラーを取得しています:

right syntax to use near 'UR) >= (SELECT L.SERVERS FROM SAMPLE L WHERE L.ID = 1 LIMIT 1)) 

は、WITH句ですがMySQLでサポートしていませんか?または、他の構文を使用する必要がありますか?どんな提案も役に立ちます。

更新:

はまた、私は別のクエリを使用しています:

CREATE TRIGGER SAMPLE_TRIGGER NO CASCADE BEFORE INSERT ON TABLE_1 
    FOR EACH ROW 
    BEGIN 
     SET NEW.RID = (SELECT ID FROM TABLE_2 WHERE ACTIVE=0 FETCH FIRST 1 ROWS ONLY WITH RS USE AND KEEP EXCLUSIVE LOCKS); 
     IF (NEW.RID IS NULL) THEN 
      SIGNAL SQLSTATE '73550' SET MESSAGE_TEXT='+ID'; 
     END IF; 
    END; 

"非コミット読み取りで、" 別のエラーにDB2で

right syntax to use near 'LIMIT 1 WITH RS USE AND KEEP EXCLUSIVE LOCKS); 
     IF (NEW.RID IS NULL) THEN' 
+1

"WITH UR"はDB2です。 "NO NOWOCK" MySql – DwB

+0

を試してください私の質問を 'WITH RS'の別の問題で更新しました。提案してください ? – user2986042

答えて

1

with ur手段を得ます。これは、hereで説明されているように、データベース内のロック機構です。

コードをMySQLに移植する場合は、これについては心配しません。したがって、それを削除してください:

CREATE TRIGGER SAMPLE BEFORE INSERT ON SERVER 
    FOR EACH ROW 
    BEGIN 
    IF ((SELECT COUNT(S.ID) FROM SERVER S) >= (SELECT L.SERVERS FROM SAMPLE L WHERE L.ID = 1 LIMIT 1)) THEN 
     SIGNAL SQLSTATE '73550' SET MESSAGE_TEXT='+ID'; 
    END IF; 
    END; 
+0

ありがとうございます。私は 'WITH RS'の別の問題で質問を更新しました。それについても何か解決策を提案してください。ロック機構にも関連しています – user2986042

+0

2回目の更新されたクエリで 'WITH RS USE AND KEEP EXCLUSIVE LOCKS'を削除しますか? – user2986042

+0

それを試してみてください。 「RS付きで排他ロックを保持する」もDB2のものです。 – DwB

関連する問題