আপডেট (2015-08-20):
ON CONFLICT DO UPDATE
(অফিশিয়াল ডকুমেন্টেশন) ব্যবহারের মাধ্যমে আপসেটগুলি পরিচালনা করার জন্য একটি অফিসিয়াল বাস্তবায়ন রয়েছে । এই লেখার সময়, এই বৈশিষ্ট্যটি বর্তমানে পোস্টগ্রিজএসকিউএল 9.5 আলফা 2 এ থাকে, যা এখানে ডাউনলোডের জন্য পাওয়া যায়: পোস্টগ্রিস উত্স ডিরেক্টরিগুলি ।
এখানে একটি উদাহরণ দেওয়া আছে, ধরে item_id
নেওয়া আপনার প্রাথমিক কী:
INSERT INTO my_table
(item_id, price)
VALUES
(123456, 10.99)
ON
CONFLICT (item_id)
DO UPDATE SET
price = EXCLUDED.price
আসল পোস্ট ...
একটি সন্নিবেশ বা আপডেট হয়েছে কিনা তা দৃশ্যমানতা অর্জনের জন্য যখন আমি পৌঁছেছিলাম তখন একটি বাস্তবায়ন এখানে এসেছে।
সংজ্ঞাটি upsert_data
হ'ল মূল্য এবং আইটেম_আইডি দু'বার উল্লেখ না করে একক উত্সে মানগুলিকে একত্রিত করা: একবার আপডেটের জন্য, আবার sertোকানোর জন্য।
WITH upsert_data AS (
SELECT
'19.99'::numeric(10,2) AS price,
'abcdefg'::character varying AS item_id
),
update_outcome AS (
UPDATE pricing_tbl
SET price = upsert_data.price
FROM upsert_data
WHERE pricing_tbl.item_id = upsert_data.item_id
RETURNING 'update'::text AS action, item_id
),
insert_outcome AS (
INSERT INTO
pricing_tbl
(price, item_id)
SELECT
upsert_data.price AS price,
upsert_data.item_id AS item_id
FROM upsert_data
WHERE NOT EXISTS (SELECT item_id FROM update_outcome LIMIT 1)
RETURNING 'insert'::text AS action, item_id
)
SELECT * FROM update_outcome UNION ALL SELECT * FROM insert_outcome
আপনি যদি ব্যবহারটি পছন্দ না করেন তবে upsert_data
এখানে একটি বিকল্প বাস্তবায়ন রয়েছে:
WITH update_outcome AS (
UPDATE pricing_tbl
SET price = '19.99'
WHERE pricing_tbl.item_id = 'abcdefg'
RETURNING 'update'::text AS action, item_id
),
insert_outcome AS (
INSERT INTO
pricing_tbl
(price, item_id)
SELECT
'19.99' AS price,
'abcdefg' AS item_id
WHERE NOT EXISTS (SELECT item_id FROM update_outcome LIMIT 1)
RETURNING 'insert'::text AS action, item_id
)
SELECT * FROM update_outcome UNION ALL SELECT * FROM insert_outcome