Penyataan MySQL DELETE menggunakan subquery sebagai syarat
Dalam MySQL, pernyataan DELETE membolehkan anda memadamkan baris daripada jadual berdasarkan syarat yang ditentukan. Situasi biasa adalah menggunakan subqueries untuk menentukan keadaan. Walau bagaimanapun, ia boleh mengecewakan untuk menghadapi ralat sintaks apabila cuba melakukan ini.
Seorang pengguna cuba memadamkan baris daripada jadual term_hierarchy menggunakan pertanyaan berikut:
<code class="language-sql">DELETE FROM term_hierarchy AS th WHERE th.parent = 1015 AND th.tid IN ( SELECT DISTINCT(th1.tid) FROM term_hierarchy AS th1 INNER JOIN term_hierarchy AS th2 ON (th1.tid = th2.tid AND th2.parent != 1015) WHERE th1.parent = 1015 );</code>
Walau bagaimanapun, ini mengakibatkan ralat berikut:
<code>You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS th WHERE th.parent = 1015 AND th.tid IN ( SELECT DISTINCT(th1.tid) FROM ter' at line 1</code>
Masalahnya di sini ialah pengehadan MySQL: jadual yang dipadamkan (term_hierarchy dalam kes ini) tidak dibenarkan untuk digunakan dalam subkueri keadaan. Sekatan ini menghalang anda daripada merujuk jadual sendiri dalam kenyataan DELETE.
Penyelesaian:
Untuk mengatasi had ini, anda boleh menggunakan subkueri bersarang yang merujuk subkueri tanpa memasukkan jadual yang akan dipadamkan. Pertanyaan yang diubah suai berikut menunjukkan ini:
<code class="language-sql">DELETE e.* FROM tableE e WHERE id IN (SELECT id FROM (SELECT id FROM tableE WHERE arg = 1 AND foo = 'bar') x);</code>
Dengan membungkus subkueri dalam subkueri lain (bernama x dalam contoh ini), MySQL boleh melakukan operasi pemadaman tanpa melanggar sekatan rujukan kendiri.
Atas ialah kandungan terperinci Bagaimana Menggunakan Subqueries dengan Benar dalam MySQL DELETE Statement untuk Mengelakkan Ralat Sintaks?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!