PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Trình kích hoạt PostgreSQL không trả về bất kỳ thứ gì

Câu hỏi của bạn còn chỗ để giải thích. Theo cách hiểu của tôi, bạn muốn RETURNING mệnh đề của INSERT lệnh trả về giá trị của khóa chính được tạo bởi một chuỗi.

Có nhiều cách khác để đạt được điều này. Như sử dụng nextval() để lấy id tiếp theo từ trình tự trước đó và chèn hàng với id đánh vần.
HOẶC currval() / lastval() để nhận giá trị thu được gần đây nhất cho một chuỗi / bất kỳ chuỗi nào trong phiên hiện tại. Thêm câu trả lời có liên quan này:
Giá trị tiếp theo của chuỗi PostgreSQL?

Bạn cũng có thể sử dụng RULE ... INSTEAD .. cho mục đích này.

Tuy nhiên, để trả lời câu hỏi của bạn - nếu đó thực tế là câu hỏi của bạn:có thể thực hiện bằng cách sử dụng hai trình kích hoạt . Một BEFORE , một AFTER INSERT . Cả hai đều được kích hoạt trong một giao dịch cho mỗi định nghĩa, vì vậy hàng ảo trong bảng đầu tiên của bạn không bao giờ hiển thị cho bất kỳ ai (ngoại trừ các yếu tố kích hoạ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();

Gọi trong 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. Nhân hai cột đã được tính toán trên một câu lệnh CASE

  2. postgresql kết hợp nhiều khoảng thời gian thành một

  3. Postgresql, Hạn chế cập nhật trên các cột cụ thể (Chỉ đọc)

  4. Postgresql:Làm thế nào để chỉ tạo bảng nếu nó chưa tồn tại?

  5. TypeError:Không thể gọi phương thức 'truy vấn' của null - khi gọi pg.connect với Heroku node.js