यह UPDATE
के लिए आसान होगा , जहां अद्यतन में शामिल अतिरिक्त पंक्तियां RETURNING
. को दिखाई देती हैं खंड:
- केवल SQL - PostgreSQL संस्करण का उपयोग करके पूर्व-अद्यतन कॉलम मान लौटाएं
वही वर्तमान में नहीं है INSERT
. के लिए संभव . प्रति दस्तावेज़:
व्यंजक table_name . द्वारा नामित तालिका के किसी भी स्तंभ नाम का उपयोग कर सकता है
table_name INSERT
. का लक्ष्य होने के नाते आदेश।
इसे काम करने के लिए आप (डेटा-संशोधित) सीटीई का उपयोग कर सकते हैं।title
मानते हुए प्रति क्वेरी अद्वितीय . होना , अन्यथा आपको और अधिक करने की आवश्यकता है:
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);
अगर title
प्रति क्वेरी अद्वितीय नहीं है (लेकिन कम से कम id
प्रति टेबल अद्वितीय है):
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);
यह दूसरी क्वेरी अनियंत्रित कार्यान्वयन विवरण पर निर्भर करती है कि प्रदान किए गए क्रम में पंक्तियां डाली जाती हैं। यह Postgres के सभी मौजूदा संस्करणों में काम करता है और शायद टूटने वाला नहीं है।
एसक्यूएल फिडल.