sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLトリガーが何も返さない

    あなたの質問は解釈の余地を残します。私の理解では、RETURNINGが必要です。 INSERTの句 シーケンスによって生成された主キーの値を返すコマンド。

    これを達成する他の方法があります。 nextval()を使用する場合と同様です。 次のidを取得します 事前にシーケンスから、idの行を挿入します スペルアウト。
    またはcurrval() / lastval() シーケンス/現在のセッションの任意のシーケンスに対して最後に取得された値を取得します。この関連する回答の詳細:
    シーケンスのPostgreSQLの次の値?

    RULE ... INSTEAD ..を使用することもできます この目的のために。

    しかし、あなたの質問に答えるために-それが実際にあなたの質問である場合:それは2つのトリガーを使用して行うことができます 。 1つのBEFORE 、1つのAFTER INSERT 。どちらも定義ごとに1つのトランザクションで実行されるため、最初のテーブルのファントム行は誰にも表示されません。 (トリガーを除く)。

    デモ:

    CREATE TABLE x (
      id serial PRIMARY KEY  -- note the serial col.
     ,name text
    );
    
    CREATE TABLE y (
      id integer PRIMARY KEY
     ,name text
    );
    
    
    CREATE OR REPLACE FUNCTION trg_x_insbef()
      RETURNS trigger AS
    $func$
    BEGIN
      INSERT INTO y SELECT (NEW).*;  -- write to other table
      RETURN NEW;
    END
    $func$ LANGUAGE plpgsql;
    
    CREATE TRIGGER insbef
      BEFORE INSERT ON x
      FOR EACH ROW EXECUTE PROCEDURE trg_x_insbef();
    
    
    CREATE OR REPLACE FUNCTION trg_x_insaft()
      RETURNS trigger AS
    $func$
    BEGIN
      DELETE FROM x WHERE id = NEW.id; -- delete row again.
      RETURN NULL;
    END
    $func$ LANGUAGE plpgsql;
    
    CREATE TRIGGER insaft
      AFTER INSERT ON x
      FOR EACH ROW EXECUTE PROCEDURE trg_x_insaft();
    

    psqlを呼び出す:

    db=# INSERT INTO x (name) values('phantom') RETURNING id;
     id
    ----
      1
    (1 row)
    
    INSERT 0 1
    
    db=# SELECT * FROM x;
     id | name
    ----+------
    (0 rows)
    
    
    db=# SELECT * FROM y;
     id |  name
    ----+---------
      1 | phantom
    (1 row)
    



    1. アソシエーションテーブルの正しい名前は何ですか(多対多の関係)

    2. SQLServerのサーバートリガーイベントのリストを返す

    3. PostgreSQL:カウント=0の後にメッセージを返す

    4. SQL Server(T-SQL)でのREPLICATE()関数のしくみ