sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL-utlösaren returnerar inte något

Din fråga lämnar utrymme för tolkning. Som jag förstår det vill du ha RETURNING satsen i INSERT kommando för att returnera värdet på primärnyckeln som genereras av en sekvens.

Det finns andra sätt att uppnå detta. Som att använda nextval() för att få nästa id från sekvensen i förväg och infoga raden med id stavas.
ELLER currval() / lastval() för att få det senast erhållna värdet för en sekvens / valfri sekvens i den aktuella sessionen. Mer i detta relaterade svar:
PostgreSQL nästa värde för sekvenserna?

Du kan också använda en RULE ... INSTEAD .. för detta ändamål.

Men för att svara på din fråga - om det i själva verket är din fråga:det kan göras genom att använda två utlösare . En BEFORE , en AFTER INSERT .Båda aktiveras i en transaktion per definition, så fantomraden i din första tabell är aldrig synlig för någon (förutom triggers).

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

Ring in 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. MYSQL visar 0 även om resultat inte finns

  2. SQL Server Interns:Problematiska operatörer Pt. III – Sorterar

  3. validering på e-post/postnummerfält i sql/oracle

  4. VÄLJ * FRÅN tabell WHERE kolumn =1,2,3,4