2016-07-12 6 views
0

MySQLでテーブルAの情報をテーブルBの新しいエントリに挿入するトリガが必要です。MySQLは新しい行にのみトリガーを挿入します

マイトリガーテーブルAに新しいエントリが作成された場合は、必ずテーブルBにテーブルAのすべてentrysを挿入します。

CREATE TRIGGER trigger_insert 
AFTER INSERT 
ON tableA FOR EACH ROW 

BEGIN 
    INSERT INTO `tableB` 
     (
     `id`, 
     `active`, 
     `created_at`, 
     `updated_at` 
     ) 
    SELECT 
     `id`, 
     `active`, 
     `created_at`, 
     NOW() 
    FROM 
     tableA; 

END; 

私の問題は、私は後にtableAのentrysを挿入する第2のトリガを持っていること、ですすべてのアップデート。だから私はidをユニークにすることができません。その結果、tableBは、tableAのINSERT文とUPDATE文の何らかの履歴です。

ありがとうございました!

+0

はどのように新しいエントリを定義しますあなたが挿入された行を意味しますが、行を更新していないのですか?? – Whencesoever

+0

新しい 'tableA.id'が追加された場合 – Michael

答えて

1

問題は、すべての行がTableAから選択されていることです。私はあなたが意図しているとします。

INSERT INTO `tableB`(`id`, `active`, `created_at`, `updated_at`) 
    SELECT new.id, new.active, new.created_at, MNW() 

あなたの質問に、より一般的な答えはtableBunique制約を追加することです。あなたがnewを使用するときに重複がまだ必要な場合

INSERT INTO `tableB`(`id`, `active`, `created_at`, `updated_at`) 
    SELECT `id`, `active`, `created_at`, MNW() 
    FROM tableA 
    ON DUPLICATE KEY UPDATE id = VALUES(id); 

、あなたはこれらを組み合わせることができます:

alter table tableB add constaint unq_tableB_id unique (id); 

が次に重複挿入を無視するinsertを変更:idが重複したエントリを定義すると仮定すると、

INSERT INTO `tableB`(`id`, `active`, `created_at`, `updated_at`) 
    SELECT new.id, new.active, new.created_at, MNW() 
    ON DUPLICATE KEY UPDATE id = VALUES(id); 

これらのクエリの両方は、idが複製の定義に使用されているものと仮定しています。

+0

私の問題は、UPDATEの後に' tableA'のエントリを挿入する2番目のトリガがあることです。だから私は 'id'をユニークにすることができません。結果は、 'tableB'は' tableA'のINSERTとUPDATE文のためのある種の履歴です – Michael

+0

@Michael Infoのような情報はOPに属しています! – topshot

+0

@Gordon Linoff:あなたの答えは、私のトリガーに 'NEW'キーワードを使用することで良いヒントを得ました。ありがとう。私が解決策を得たら、私はアップデートを投稿します。 @マイケル。 – Michael

1

私の問題の解決策は、間違った使用法INSERT INTO ... SELECTに基づいていました。代わりに、私は新しいデータのみを処理するNEWキーワードを使用する必要がありました:

CREATE TRIGGER trigger_insert 
AFTER INSERT 
ON tableA FOR EACH ROW 

BEGIN 

    INSERT INTO `tableB` 
    (
     `id`, 
     `active`, 
     `created_at`, 
     `updated_at` 
    ) 
    VALUES 
    (
     NEW.`id`, 
     NEW.`active`, 
     NEW.`created_at`, 
     NOW() 
    ); 
END; 
関連する問題