PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Pemicu PostgreSQL tidak mengembalikan apa pun

Pertanyaan Anda menyisakan ruang untuk interpretasi. Cara saya memahaminya, Anda menginginkan RETURNING klausa dari INSERT perintah untuk mengembalikan nilai kunci utama yang dihasilkan oleh suatu urutan.

Ada cara lain untuk mencapai ini. Seperti menggunakan nextval() untuk mendapatkan id berikutnya dari urutan sebelumnya dan masukkan baris dengan id dieja.
ATAU currval() / lastval() untuk mendapatkan nilai yang paling baru diperoleh untuk urutan / urutan apa pun di sesi saat ini. Lebih lanjut dalam jawaban terkait ini:
PostgreSQL nilai urutan berikutnya?

Anda juga bisa menggunakan RULE ... INSTEAD .. untuk tujuan ini.

Namun, untuk menjawab pertanyaan Anda - jika memang itu pertanyaan Anda:dapat dilakukan dengan menggunakan dua pemicu . Satu BEFORE , satu AFTER INSERT .Keduanya diaktifkan dalam satu transaksi per definisi, jadi baris hantu di tabel pertama Anda tidak pernah terlihat oleh siapa pun (kecuali pemicu).

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

Panggil 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. postgres array_agg ERROR:tidak dapat mengakumulasi array dengan dimensi berbeda

  2. Panggilan untuk makalah untuk PGDay.IT 2011 telah diperpanjang

  3. Membuat urutan karakter pada postgreSQL

  4. Membuat urutan pada tabel yang ada

  5. Menemukan data database yang paling sesuai dengan respons variabel pengguna