Mendapatkan semula Nilai Pra-Kemas Kini menggunakan SQL SAHAJA
Dalam senario di mana pencetus, prosedur tersimpan atau entiti luaran tidak tersedia, ia menjadi perlu untuk mendapatkan semula nilai lama lajur daripada baris yang telah dikemas kini menggunakan SQL sahaja.
Cabaran
Mendapatkan semula nilai prakemas kini terus daripada klausa RETURNING tidak mungkin kerana ia hanya mengembalikan nilai pasca kemas kini.
Penyelesaian menggunakan Self-Join
Penyelesaian adalah dengan menyertai jadual untuk satu lagi contoh sendiri menggunakan syarat yang mengenal pasti baris yang sedang dikemas kini secara unik. Ini membenarkan akses kepada kedua-dua nilai lama dan baharu dalam klausa RETURNING.
UPDATE my_table SET processing_by = our_id_info FROM my_table AS old_my_table WHERE old_my_table.trans_nbr = my_table.trans_nbr AND my_table.row_id = old_my_table.row_id RETURNING my_table.row_id, my_table.processing_by, old_my_table.processing_by AS old_processing_by
Mengendalikan Concurrency
Untuk mengelakkan keadaan perlumbaan yang berpotensi, adalah penting untuk mengelakkan penulisan serentak ke baris yang sama semasa kemas kini. Ini boleh dicapai menggunakan kunci eksplisit pada baris yang akan dikemas kini:
UPDATE my_table SET processing_by = our_id_info FROM (SELECT * FROM my_table WHERE trans_nbr = 4 FOR UPDATE) AS old_my_table WHERE old_my_table.trans_nbr = my_table.trans_nbr RETURNING my_table.row_id, my_table.processing_by, old_my_table.processing_by AS old_processing_by
Ini memastikan bahawa hanya baris yang dikunci oleh subkueri diproses, menghalang kemas kini yang bercanggah.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Dapatkan Nilai Lajur Pra-Kemas Kini dalam SQL Tanpa Menggunakan Pencetus atau Prosedur Tersimpan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!