sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL spoušť nic nevrací

Vaše otázka ponechává prostor pro interpretaci. Jak tomu rozumím, chcete RETURNING klauzule INSERT příkaz k vrácení hodnoty primárního klíče generovaného sekvencí.

Existují i ​​jiné způsoby, jak toho dosáhnout. Stejně jako použití nextval() získat další id ze sekvence předem a vložte řádek s id napsáno.
NEBO currval() / lastval() chcete-li získat naposledy získanou hodnotu pro sekvenci / jakoukoli sekvenci v aktuální relaci. Více v této související odpovědi:
PostgreSQL další hodnota sekvencí?

Můžete také použít RULE ... INSTEAD .. pro tento účel.

Ale abych odpověděl na vaši otázku – pokud je to ve skutečnosti vaše otázka:lze to provést pomocí dvou spouštěčů . Jeden BEFORE , jeden AFTER INSERT .Oba jsou spuštěny v jedné transakci na definici, takže fiktivní řádek ve vaší první tabulce nikdy není viditelný pro nikoho (kromě spouštěčů).

Demo:

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();

Zavolejte v 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. Jak být více Laravel v aplikaci CRUD?

  2. Studium zdrojového kódu MySQL a SQLite, abyste se dozvěděli o implementaci RDBMS

  3. Akce GitHubu:Jak se připojit k Postgres v akcích GitHubu

  4. Jak mohu ignorovat ampersandy ve skriptu SQL spuštěném z SQL Plus?