Pertanyaan SQL UPDATE urutan evaluasi


Apa urutan evaluasi dalam pertanyaan berikut:

UPDATE tbl SET q = q + 1, p = q;

Artinya, akan "tbl"."p" disetel ke q atau q + 1? Apakah urutan evaluasi di sini diatur oleh standar SQL?

Terima kasih.

MEMPERBARUI

Setelah mempertimbangkan Jawaban Migs, Saya menjalankan beberapa tes pada semua DB yang bisa saya temukan. Meskipun saya tidak tahu apa yang dikatakan standar, implementasi bervariasi.

Diberikan

CREATE TABLE tbl (p INT NOT NULL, q INT NOT NULL);
INSERT INTO tbl VALUES (1, 5);   -- p := 1, q := 5
UPDATE tbl SET q = q + 1, p = q;

Saya menemukan nilai-nilai "p" dan "q" adalah:

database           p   q
-----------------+---+---
Firebird 2.1.3   | 6 | 6  -- But see "Update 2" below
InterBase 2009   | 5 | 6
MySQL 5.0.77     | 6 | 6  -- See "Update 3" below
Oracle XE (10g)  | 5 | 6
PostgreSQL 8.4.2 | 5 | 6
SQLite 3.3.6     | 5 | 6
SQL Server 2016  | 5 | 6

PERBARUI 2

Firebird 2.5 mengubah perilakunya agar sesuai dengan mayoritas mesin SQL lainnya yang saya uji, meninggalkan MySQL sendiri. Catatan Catatan Rilis yang relevan, "Perubahan Logika dalam SET Clause", sangat menyarankan itu perilaku mayoritas benar sesuai spesifikasi SQL.

Saya telah menyadap MySQL untuk mengomentari perilaku ini (bug no. 52861), karena mereka kelihatannya seperti orang asing.

PERBARUI 3

Bug yang disebutkan di atas adalah hari ini (2010-05-19) ditutup, dan dokumentasi disetel untuk diperbarui agar perilaku ini jelas baik dalam MEMPERBARUI deskripsi dan di Perbedaan dari SQL Standar bagian.

Bravo, MySQL.


32
2018-02-04 21:03


asal


Jawaban:


MySQL melakukan evaluasi "kiri ke kanan" dan melakukan "melihat" nilai-nilai baru. (Diuji pada 5.0.45-community-nt-log MySQL Community Edition)

Lebih jauh lagi, dari manual MySQL: "Single-table UPDATE assignments umumnya dievaluasi dari kiri ke kanan. Untuk pembaruan multi-table, tidak ada jaminan bahwa penugasan dilakukan dalam urutan tertentu."

Sekarang, "umumnya" cukup samar dan "tidak ada jaminan" sangat buruk mengingat bahwa urutan evaluasi itu penting.

Jadi, untuk menjawab pertanyaan: ADALAH perilaku yang ditentukan oleh "standar SQL" atau hanya sebuah konvensi?


UPDATE: Punya spesifikasi SQL92 yang menyatakan pada "13.10 pembaruan pernyataan: dicari" item "6) The (ekspresi nilai) s secara efektif dievaluasi untuk setiap baris T sebelum memperbarui baris T."

IMHO tidak benar-benar tidak ambigu, tetapi cukup untuk mempertimbangkan bahwa STANDAR TIDAK "melihat" hasil pembaruan Anda sendiri. Mempertimbangkan contoh Anda, cara Oracle, PostgreSQL, dan Interbase melakukannya.


13
2018-04-13 20:06



Itu UPDATE tidak melihat hasil kerjanya.

p akan diatur ke q seperti sebelum pembaruan.

Kode berikut hanya akan menukar kolom:

DECLARE @test TABLE (p INT, q INT)

INSERT
INTO    @test
VALUES  (2, 3)

SELECT  *
FROM    @test

p    q
---  ---
  2    3

UPDATE  @test
SET     p = q,
        q = p

SELECT  *
FROM    @test

p    q
---  ---
  3    2

5
2018-02-04 21:07



Menulis ke meja harus terjadi setelah transaksi yang berjalan dengan baik ketika membaca selesai.


-1
2018-02-04 21:05