2017-08-10 25 views
0

INSERTにMySQLトリガーを作成したい場合:wp_postsテーブルに新しいレコードが挿入されたら、wp_posts.post_authorを更新して、2つのサブクエリを使用してデータを取得しますより良く行われます)。MySQLのトリガーと条件付きアップデート

とにかく、更新は「条件付き」である必要があります。つまり、wp_posts.post_titleの値が「A」、「B」または「C」の場合にのみ行を更新する必要があります。これは可能ですか?

これは私が試したものです:

CREATE TRIGGER updatePostIDonInsert 
AFTER INSERT 
    ON wp_posts FOR EACH ROW 

BEGIN 

    -- variable declarations 

    -- trigger code 
// ? (pseudo: if wp_posts.post_title IN ("A","B","C") then...) 

UPDATE wp_posts SET post_author = 
(SELECT ID from wp_users WHERE user_email = 
(SELECT meta_value FROM `wp_postmeta` WHERE post_id = wp_posts.ID AND meta_key = "_from_email")) 

END; 

すべてのヘルプは

を高く評価している[UPDATE]私が試した最新のクエリ:

CREATE TRIGGER updatePostIDonInsert 
    BEFORE INSERT 
     ON wp_posts FOR EACH ROW 
    BEGIN 

    IF FIND_IN_SET(NEW.post_title,'General contact,Website contact,Master contact') > 0 AND NEW.post_type ='inbound_com' THEN 
    SET NEW.post_author = (SELECT ID from wp_users WHERE user_email = (SELECT meta_value FROM wp_postmeta WHERE post_id = NEW.ID AND meta_key = '_from_email')); 

    END IF; 

    END; 

(phpMyAdminにトリガー部を介して挿入された場合は、この作品最終ENDはなく、IFから開始)

+1

私はあなたが挿入トリガーを行っている同じテーブルを更新することはできないと思う、あなたができることは、トリガーを挿入してpost_authorの値を変更するので、変更された値が他の値あなたの挿入クエリ。 SET NEW.post_author = <ここの値>は、値がサブクエリから来る場合は単一レコードを返すべきです。 – Learning

+0

これを指摘してくれてありがとう(私は非常に新しいトリガーで、一般的にはdbsで動作しません) –

+1

挿入するvalueofフィールドにアクセスするには、NEWキーワードを使用する必要があります。すなわちIF FIND_IN_SET(NEW.post_title、 'A、B、C、D')> 0。代わりに[FIND_IN_SET](http://www.w3resource.com/mysql/string-functions/mysql-find_in_set-function.php)関数を使用してください – Learning

答えて

1

にこのようなものであればここで

トリガーだけで何かを行います。代わりにINSERT TRIGGER

CREATE TRIGGER updatePostIDonInsert 
    BEFORE INSERT 
     ON wp_posts FOR EACH ROW 
    BEGIN 
     // add this condition  
    IF FIND_IN_SET(NEW.post_title,'A,B,C') > 0 THEN 

      -- variable declarations 

      -- trigger code 
      SET NEW.post_author = (SELECT ID from wp_users WHERE user_email = 
(SELECT meta_value FROM `wp_postmeta` WHERE post_id = NEW.ID AND meta_key = "_from_email") LIMIT 1); 
     END IF; 

    END; 

前のAFTER INSERT活用を引き起こすあなたは必ず、あなたのサブクエリで返されるだけで、単一の行があることを確認する必要があります。あなたのデータベース構造に精通していないので、あなたのpost_authorのサブクラスをどのように最適化できるかは実際には分かりません。

残りはあなた次第です。必要なときはいつでもFIND_IN_SETを使うことができます。

+0

#1064 - SQL構文に誤りがあります。 MariaDBサーバーのバージョンに対応するマニュアルを調べ、適切な構文が行の近くで使用されるようにしてください(行はNEW.post_author =を設定しています)。) –

+0

"with"を置き換えると、次のようになります。 "#1064 - SQL構文に誤りがあります。あなたのMariaDBサーバのバージョンに対応するマニュアルをチェックして、8行目の「END IF」の近くで使用するようにしてください。 –

+0

wp_posts.IDはNEW.IDではありませんか(ちょうど質問しています) –

0

これは必要ですか?新たに挿入されたPOST_TITLEは( "A"、 "B"、 "C")

CREATE TRIGGER updatePostIDonInsert 
AFTER INSERT 
    ON wp_posts FOR EACH ROW 
BEGIN 
    // add this condition 
    IF (NEW.post_title IN ("A","B","C")) THEN 

     -- variable declarations 

     -- trigger code 
     // ? (pseudo: if wp_posts.post_title IN ("A","B","C") then...) 

     UPDATE wp_posts SET post_author = 
     (SELECT ID from wp_users WHERE user_email = 
     (SELECT meta_value FROM `wp_postmeta` WHERE post_id = wp_posts.ID AND meta_key = "_from_email")) 
    END IF; 

END; 
+0

AFTER INSERTの後に同じテーブルを更新できないようです。上記の内容を確認してください。 –