Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mendapatkan Nilai Lajur Lama Selepas KEMASKINI dalam PostgreSQL Hanya Menggunakan SQL?

Bagaimana untuk Mendapatkan Nilai Lajur Lama Selepas KEMASKINI dalam PostgreSQL Hanya Menggunakan SQL?

DDD
DDDasal
2025-01-06 00:52:39287semak imbas

How to Retrieve Old Column Values After an UPDATE in PostgreSQL Using Only SQL?

Cara Mendapatkan Nilai Lajur Pra Kemas Kini Menggunakan SQL Sahaja

Masalah:

PostgreSQL tidak membenarkan mendapatkan semula pra- kemas kini nilai lajur dalam klausa KEMBALI bagi pernyataan KEMASKINI. Ini menimbulkan cabaran apabila ingin mendapatkan nilai lama lajur yang dikemas kini tanpa menggunakan mekanisme tambahan seperti pencetus atau prosedur.

Penyelesaian Menggunakan Gabungan Sendiri:

Satu penyelesaian adalah untuk memanfaatkan penyambungan diri dalam klausa FROM. Teknik ini mencipta salinan jadual dengan berkesan dan membenarkan untuk merujuk kedua-dua nilai yang dikemas kini dan prakemas kini:

UPDATE tbl x
SET    tbl_id = 23
     , name = 'New Guy'
FROM   tbl y                -- Using the FROM clause
WHERE  x.tbl_id = y.tbl_id  -- Must be UNIQUE NOT NULL
AND    x.tbl_id = 3
RETURNING y.tbl_id AS old_id, y.name AS old_name
        , x.tbl_id          , x.name;

Kaedah ini memerlukan lajur UNIK BUKAN NULL untuk penyambungan sendiri, memastikan setiap baris dipadankan kepada seorang rakan sejawat dalam contoh yang dicantumkan.

Penyelesaian untuk Tulisan Serentak Muatan:

Dalam senario yang melibatkan konkurensi tulis berat, dua pilihan wujud untuk mencegah keadaan perlumbaan:

Pilihan 1: Tahap Pengasingan BOLEH BERSIRI:

Menggunakan tahap pengasingan SERIALIZABLE memastikan akses eksklusif kepada baris semasa pelaksanaan transaksi, dengan itu menghalang penulisan serentak:

BEGIN ISOLATION LEVEL SERIALIZABLE;
UPDATE ... ;
COMMIT;

Pilihan 2: Penguncian Eksplisit:

Secara bergantian, penguncian eksplisit boleh digunakan untuk mengelakkan kemas kini baris serentak:

UPDATE tbl x
SET    tbl_id = 24
     , name = 'New Gal'
FROM  (SELECT tbl_id, name FROM tbl WHERE tbl_id = 4 FOR UPDATE) y 
WHERE  x.tbl_id = y.tbl_id
RETURNING y.tbl_id AS old_id, y.name AS old_name
        , x.tbl_id          , x.name;

Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Nilai Lajur Lama Selepas KEMASKINI dalam PostgreSQL Hanya Menggunakan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn