2016-08-19 6 views
0

私は行のデータ値がチェックされているので、同じ名前の行を持つテーブルから別のテーブルに行を転送するトリガーを作成する必要があります。これは、何かが挿入または変更されたときに起こるはずです。何か案は?テーブルからindentical他のテーブルに行を移動するMysqlのトリガー

+0

「コピーされた」のように「元のテーブルにこれ以上持たない」または「移動しました」のように「移動」されていますか? "newtable(col1、col2、...)を選択してnew.col1、new.col2、...を選択してトリガーで行うことができます。 – Solarflare

+0

基本的には、すべてのトリガーでそれを行う – Drew

+0

トリガーやイベントのコンボでそれを行う方法を私に教えたいなら、 – Drew

答えて

0

MySQLエラー1442:

エラーコード:それはすでにこのストアド 機能/トリガーを呼び出したステートメントによって使用されているため、1442が格納されている機能/トリガ にテーブル「XYZ」を更新できません。

トリガコールがカスケード接続または再帰的な場合は、同じコールスタック内にあることをサーバが認識しているために発生します。

あなたが選べる頻度を選ぶイベントクリーンアップ戦略を活用することが最善の方法です。それを使用する場合は、グローバルイベントスケジューラを利用することを忘れないでください。実行中であることを忘れることはできません。また、ほとんどの共有ホスティング環境では、リソースが共有されているためにイベントがサポートされません(人々はそれらを悪用する傾向があり、すべての人に影響を与えます)。前記

スキーマ:

create table orig101 
( id int auto_increment primary key, 
    thing1 varchar(100) not null, 
    checked int not null 
); 

create table copy101 
( id int primary key, 
    thing1 varchar(100) not null, 
    checked int not null 
); 

イベント:

DROP EVENT IF EXISTS cleanUpCopied; 
DELIMITER $$ 
CREATE EVENT cleanUpCopied 
    ON SCHEDULE EVERY 2 MINUTE STARTS '2016-01-01 00:00:00' 
    ON COMPLETION PRESERVE 
DO 
    BEGIN 
    DELETE FROM orig101 WHERE checked=1; 
    END $$ 
DELIMITER ; 
-- ------------------------------------------------- 
select @@event_scheduler; -- mine is currently OFF 
SET GLOBAL event_scheduler = ON; -- turn her on and confirm below 
select @@event_scheduler; -- yep it is ON 

トリガ:

DROP TRIGGER IF EXISTS aft_ins_orig; 
delimiter $$ 
CREATE TRIGGER aft_ins_orig AFTER INSERT ON orig101 
FOR EACH ROW 
BEGIN 
    IF NEW.checked=1 THEN 
     INSERT IGNORE copy101 (id,thing1,checked) 
     SELECT NEW.id,NEW.thing1,NEW.checked; 

    END IF; 
END;$$ 
delimiter ; 
-- ------------------------------------------------- 
DROP TRIGGER IF EXISTS aft_upd_orig; 
delimiter $$ 
CREATE TRIGGER aft_upd_orig AFTER UPDATE ON orig101 
FOR EACH ROW 
BEGIN 
    IF NEW.checked=1 THEN 
     INSERT IGNORE copy101 (id,thing1,checked) 
     SELECT NEW.id,NEW.thing1,NEW.checked; 
    END IF; 
END;$$ 
delimiter ; 

試験:

truncate orig101; 
truncate copy101; 

INSERT orig101 (thing1,checked) values ('frog',0); 
select * from orig101; -- 1 row 
select * from copy101; -- 0 rows 

INSERT orig101 (thing1,checked) values ('fish',1); -- when evt fires, cleanup occurs 
select * from orig101; -- until evt fires, checked=1 row(s) still there 
select * from copy101; 

INSERT orig101 (thing1,checked) values ('fish2',1); -- when evt fires, cleanup occurs 
INSERT orig101 (thing1,checked) values ('fish3',1); -- when evt fires, cleanup occurs 
INSERT orig101 (thing1,checked) values ('fish4',1); -- when evt fires, cleanup occurs 
INSERT orig101 (thing1,checked) values ('fish5',1); -- when evt fires, cleanup occurs 

select * from orig101; -- until evt fires, checked=1 row(s) still there 
select * from copy101; 

UPDATE orig101 set checked=1 where id=1; 

-- Tweak the frequency of event firing (say every minute, or every hour, whatever) 

私のイベントのプロフィールページから約3つのリンクがあります。がんばろう。

関連する問題