0

sqlite3 でカウンターを作成しようとしています

列 c3 は私のカウンターです

必要なのは、c1 と c2 が update ステートメントと一致しない場合に新しい行を挿入するトリガーです。

セットアップ:

CREATE TABLE t1 (c1,c2,c3);
INSERT INTO t1 VALUES (1,1,1);

私の更新コマンド:

UPDATE t1 SET c3=(SELECT c3 FROM t1 WHERE c1=1 AND c2=1) + 1 WHERE c1=1 AND c2=1;

これがトリガーです。私が得たものですが、機能していません。

CREATE TRIGGER tr1 
BEFORE UPDATE ON t1 
  WHEN (SELECT COUNT(*) FROM t1 WHERE c1=NEW.c1 AND c2=NEW.c2) < 1 
    BEGIN 
      INSERT INTO t1 (c1,c2,c3) VALUES (NEW.c1, NEW.c2, 0); 
    END;

ここに私が試したいくつかの絶望的なことがあります:

CREATE TRIGGER tr1 BEFORE UPDATE ON t1 WHEN (SELECT COUNT(*) FROM t1 WHERE c1=1 AND c2=2) < 1 BEGIN INSERT INTO t1 (c1,c2,c3) VALUES (2, 2, 0); END;
CREATE TRIGGER tr2 BEFORE UPDATE ON t1 WHEN (SELECT COUNT(*) FROM t1 WHERE c1=NEW.c1 AND c2=NEW.c2) = 0 BEGIN INSERT INTO t1 VALUES (2, 2, 0); END;
CREATE TRIGGER tr3 AFTER UPDATE ON t1 WHEN (SELECT COUNT(*) FROM t1 WHERE c1=NEW.c1 AND c2=NEW.c2) = 0 BEGIN INSERT INTO t1 VALUES (2, 2, 0); END;
4

1 に答える 1

0

挿入と 2 つのトリガーで動作するようになりました。

CREATE TABLE t1 (c1,c2,c3);

CREATE TRIGGER tr1 BEFORE INSERT ON t1 BEGIN SELECT RAISE(IGNORE) WHERE (SELECT COUNT(*) FROM t1 WHERE c1=NEW.c1 AND c2=NEW.c2) > 0;
END;
CREATE TRIGGER tr2 BEFORE INSERT ON t1 BEGIN UPDATE t1 SET c3=(SELECT c3 FROM t1 WHERE c1=NEW.c1 AND c2=NEW.c2) + 1 WHERE c1=new.c1 AND c2=new.c2;END;
COMMIT;

これにより、次が挿入されます。

INSERT INTO t1 VALUES (1,1,1);

これにより、カウンターが更新され、インクリメントされます。

INSERT INTO t1 VALUES (1,1,1);

誰かがこれらのトリガーを 1 つに組み合わせることができれば、それは素晴らしいことです。

于 2012-08-10T15:30:44.080 に答える