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

CHÈN VÀO ... TỪ CHỌN ... QUAY LẠI ánh xạ id

Điều này sẽ đơn giản hơn cho UPDATE , nơi các hàng bổ sung được tham gia vào bản cập nhật được hiển thị cho RETURNING mệnh đề:

  • Trả lại các giá trị cột trước khi CẬP NHẬT Chỉ sử dụng SQL - Phiên bản PostgreSQL

Hiện tại cũng vậy không có thể cho INSERT . Theo tài liệu:

Biểu thức có thể sử dụng bất kỳ tên cột nào của bảng được đặt tên bởi table_name

table_name là mục tiêu của INSERT lệnh.

Bạn có thể sử dụng CTE (sửa đổi dữ liệu) để làm cho điều này hoạt động.
Giả sử title trở thành duy nhất cho mỗi truy vấn , nếu không, bạn cần phải làm thêm:

WITH sel AS (
   SELECT id, title
   FROM   posts
   WHERE  id IN (1,2)   -- select rows to copy
   )
,    ins AS (
   INSERT INTO posts (title)
   SELECT title FROM sel
   RETURNING id, title
 )
SELECT ins.id, sel.id AS from_id
FROM   ins
JOIN   sel USING (title);

Nếu title không phải là duy nhất cho mỗi truy vấn (nhưng ít nhất id là duy nhất trên mỗi bảng):

WITH sel AS (
   SELECT id, title, row_number() OVER (ORDER BY id) AS rn
   FROM   posts
   WHERE  id IN (1,2)   -- select rows to copy
   ORDER  BY id
   )
,    ins AS (
   INSERT INTO posts (title)
   SELECT title FROM sel ORDER  BY id  -- ORDER redundant to be sure
   RETURNING id
 )
SELECT i.id, s.id AS from_id
FROM  (SELECT id, row_number() OVER (ORDER BY id) AS rn FROM ins) i
JOIN   sel s USING (rn);

Truy vấn thứ hai này dựa vào chi tiết triển khai không có tài liệu mà các hàng được chèn theo thứ tự được cung cấp. Nó hoạt động trong tất cả các phiên bản hiện tại của Postgres và có lẽ sẽ không bị hỏng.

SQL Fiddle.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. lệnh không hợp lệ psql \ N trong khi khôi phục sql

  2. Cách POSITION () hoạt động trong PostgreSQL

  3. Cách cài đặt PostgreSQL 12 trên Fedora 33

  4. Postgresql UUID được hỗ trợ bởi Hibernate?

  5. Làm cách nào để nhận hỗ trợ LISTEN / NOTIFY không đồng bộ / hướng sự kiện trong Java bằng cách sử dụng cơ sở dữ liệu Postgres?