Saya memiliki instruktur tabel dan saya ingin menghapus catatan yang memiliki gaji dalam kisaran Cara yang intuitif seperti ini:
delete from instructor where salary between 13000 and 15000;
Namun, dalam mode aman, saya tidak dapat menghapus rekaman tanpa memberikan kunci utama (ID).
Jadi saya menulis sql berikut:
delete from instructor where ID in (select ID from instructor where salary between 13000 and 15000);
Namun, ada kesalahan:
You can't specify target table 'instructor' for update in FROM clause
Saya bingung karena saat saya menulis
select * from instructor where ID in (select ID from instructor where salary between 13000 and 15000);
itu tidak menghasilkan kesalahan.
Pertanyaanku adalah:
- apa sebenarnya arti pesan kesalahan ini dan mengapa kode saya salah?
- bagaimana cara menulis ulang kode ini agar berfungsi dalam mode aman?
Terima kasih!
Jawaban:
Mencari-cari di Google, jawaban yang populer tampaknya "matikan saja mode aman" :
SET SQL_SAFE_UPDATES = 0; DELETE FROM instructor WHERE salary BETWEEN 13000 AND 15000; SET SQL_SAFE_UPDATES = 1;
Jika saya jujur, saya tidak bisa mengatakan saya pernah membuat kebiasaan berlari dalam mode aman. Namun, saya tidak sepenuhnya nyaman dengan jawaban ini karena ini hanya mengasumsikan Anda harus mengubah konfigurasi database Anda setiap kali Anda mengalami masalah.
Jadi, kueri kedua Anda lebih dekat ke tanda, tetapi mengalami masalah lain: MySQL menerapkan beberapa batasan pada subkueri, dan salah satunya adalah Anda tidak dapat mengubah tabel saat memilihnya di subkueri.
Mengutip dari manual MySQL, Batasan pada Subqueries :
Bagian terakhir itu adalah jawaban Anda. Pilih ID target di tabel sementara, lalu hapus dengan mereferensikan ID di tabel itu:
DELETE FROM instructor WHERE id IN ( SELECT temp.id FROM ( SELECT id FROM instructor WHERE salary BETWEEN 13000 AND 15000 ) AS temp );
Demo SQLFiddle .
sumber
ID
, sementara jawaban saya menggunakanid
.Anda dapat mengelabui MySQL dengan berpikir bahwa Anda sebenarnya menentukan kolom kunci utama. Ini memungkinkan Anda untuk "menimpa" mode aman.
Dengan asumsi Anda memiliki tabel dengan kunci utama numerik yang bertambah otomatis, Anda dapat melakukan hal berikut:
DELETE FROM tbl WHERE id <> 0
sumber
Mematikan mode aman di meja kerja Mysql 6.3.4.0
Menu edit => Preferensi => Editor SQL: Bagian lain: klik "Pembaruan aman" ... untuk menghapus centang opsi
sumber
Saya memiliki solusi yang jauh lebih sederhana, ini berhasil untuk saya; ini juga merupakan solusi tetapi mungkin dapat digunakan dan Anda tidak perlu mengubah pengaturan Anda. Saya berasumsi Anda dapat menggunakan nilai yang tidak akan pernah ada, lalu Anda menggunakannya pada klausa WHERE Anda
HAPUS DARI MyTable WHERE MyField IS_NOT_EQUAL AnyValueNoItemOnMyFieldWillEverHave
Saya juga tidak terlalu menyukai solusi itu, itulah mengapa saya ada di sini, tetapi berhasil dan tampaknya lebih baik daripada yang telah dijawab
sumber