Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mendapatkan Nilai Lajur Lama Selepas KEMASKINI dalam PostgreSQL Hanya Menggunakan SQL?
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!