Dalam beberapa kasus, menjalankan pernyataan UPDATE dalam produksi dapat menghemat waktu. Namun pembaruan yang rusak bisa lebih buruk dari masalah awal.
Singkatnya menggunakan database pengujian, apa saja opsi untuk mengetahui apa yang akan dilakukan pernyataan pembaruan sebelum menjalankannya?
FOREIGN KEY UPDATE CASCADE
sql Anda gagalBagaimana dengan Transaksi? Mereka memiliki Fitur ROLLBACK.
@see https://dev.mysql.com/doc/refman/5.0/en/commit.html
Sebagai contoh:
START TRANSACTION; SELECT * FROM nicetable WHERE somthing=1; UPDATE nicetable SET nicefield='VALUE' WHERE somthing=1; SELECT * FROM nicetable WHERE somthing=1; #check COMMIT; # or if you want to reset changes ROLLBACK; SELECT * FROM nicetable WHERE somthing=1; #should be the old value
Jawab pertanyaan dari @rickozoe di bawah ini:
Secara umum baris ini tidak akan dijalankan sekali. Di PHP fe Anda akan menulis sesuatu seperti itu (mungkin sedikit lebih bersih, tetapi ingin menjawab dengan cepat ;-)):
$MysqlConnection->query('START TRANSACTION;'); $erg = $MysqlConnection->query('UPDATE MyGuests SET lastname='Doe' WHERE id=2;'); if($erg) $MysqlConnection->query('COMMIT;'); else $MysqlConnection->query('ROLLBACK;');
Cara lain adalah dengan menggunakan Variabel MySQL (lihat https://dev.mysql.com/doc/refman/5.7/en/user-variables.htm l dan https://stackoverflow.com/a/18499823/1416909 ):
# do some stuff that should be conditionally rollbacked later on SET @v1 := UPDATE MyGuests SET lastname='Doe' WHERE id=2; IF(v1 < 1) THEN ROLLBACK; ELSE COMMIT; END IF;
Tetapi saya akan menyarankan untuk menggunakan pembungkus bahasa yang tersedia dalam bahasa pemrograman favorit Anda.
sumber
Komit Otomatis NONAKTIF ...
MySQL
set autocommit=0;
Ini menyetel autommit off untuk sesi saat ini.
Anda menjalankan pernyataan Anda, melihat apa yang telah berubah, dan kemudian mengembalikan jika itu salah atau berkomitmen jika itu yang Anda harapkan!
EDIT: Manfaat menggunakan transaksi daripada menjalankan kueri pemilihan adalah Anda dapat memeriksa set yang dihasilkan dengan lebih mudah.
sumber
Saya tahu ini adalah pengulangan jawaban lain, tetapi memiliki dukungan emosional untuk mengambil langkah ekstra untuk menguji pembaruan: D
Untuk pengujian pembaruan, hash # adalah teman Anda.
Jika Anda memiliki pernyataan pembaruan seperti:
UPDATE wp_history SET history_by="admin" WHERE history_ip LIKE '123%'
Anda melakukan hash UPDATE dan SET out untuk pengujian, lalu hash mereka kembali:
SELECT * FROM #UPDATE wp_history #SET history_by="admin" WHERE history_ip LIKE '123%'
Ini bekerja untuk pernyataan sederhana.
Solusi tambahan yang praktis wajib adalah, untuk mendapatkan salinan (duplikat cadangan), setiap kali menggunakan pembaruan pada tabel produksi. Phpmyadmin> operasi> salin: table_yearmonthday. Hanya membutuhkan beberapa detik untuk tabel <= 100M.
sumber
Bukan jawaban langsung, tetapi saya telah melihat banyak situasi data prod yang rusak yang dapat dihindari dengan mengetikkan
WHERE
klausa terlebih dahulu ! Kadang-kadangWHERE 1 = 0
dapat membantu menyusun pernyataan kerja dengan aman juga. Dan melihat rencana pelaksanaan yang diperkirakan, yang akan memperkirakan baris yang terpengaruh, dapat berguna. Di luar itu, dalam transaksi yang Anda batalkan seperti yang dikatakan orang lain.sumber
WHERE 1 = 0
lebih portabel jika ada yang menemukan ini yang bekerja dengan DBMS yang berbeda. Misalnya, SQL Server tidak akan menerimaWHERE FALSE
.Dalam kasus ini yang ingin Anda uji, sebaiknya fokus hanya pada nilai kolom saat ini dan segera diperbarui. .
Silakan lihat kode berikut yang saya tulis untuk memperbarui harga WHMCS:
# UPDATE tblinvoiceitems AS ii SELECT ### JUST ii.amount AS old_value, ### FOR h.amount AS new_value ### TESTING FROM tblinvoiceitems AS ii ### PURPOSES. JOIN tblhosting AS h ON ii.relid = h.id JOIN tblinvoices AS i ON ii.invoiceid = i.id WHERE ii.amount <> h.amount ### Show only updatable rows # SET ii.amount = h.amount
Dengan cara ini kami dengan jelas membandingkan nilai yang sudah ada dengan nilai baru.
sumber
Jalankan kueri pemilihan pada tabel yang sama dengan semua
where
kondisi yang Anda terapkan dalam kueri pembaruan.sumber
buat
SELECT
itu,seperti jika Anda punya
UPDATE users SET id=0 WHERE name='jan'
ubah menjadi
SELECT * FROM users WHERE name='jan'
sumber
Satu opsi lagi adalah meminta MySQL untuk rencana kueri. Ini memberi tahu Anda dua hal:
Di MySQL dan sebagian besar database SQL, perintah query plan adalah
describe
, jadi Anda akan melakukan:describe update ...;
sumber