Menavigasi Had Subquery Pernyataan DELETE MySQL
PenyataanMySQL DELETE
kadangkala boleh membuang ralat "Anda mempunyai ralat dalam sintaks SQL anda..." apabila digunakan dengan subkueri dalam klausa WHERE
. Had ini timbul daripada sekatan MySQL untuk merujuk jadual sasaran dalam subkueri.
Pertanyaan Ilustrasi dan Ralat Sintaks
Mari kita periksa pertanyaan yang direka untuk memadamkan entri daripada jadual term_hierarchy
berdasarkan syarat subkueri:
<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>
Pertanyaan ini gagal kerana MySQL tidak membenarkan penggunaan jadual dipadamkan (term_hierarchy
) dalam klausa WHERE
subquery.
Penyelesaian: Subkueri Bersarang
Penyelesaian terletak pada menyarangkan subkueri:
<code class="language-sql">DELETE FROM term_hierarchy AS th WHERE th.parent = 1015 AND th.tid IN ( SELECT id FROM (SELECT DISTINCT(th1.tid) AS id FROM term_hierarchy AS th1 INNER JOIN term_hierarchy AS th2 ON (th1.tid = th2.tid AND th2.parent != 1015) WHERE th1.parent = 1015) x );</code>
Penjelasan Penyelesaian
Dengan merangkum subkueri asal (SELECT DISTINCT(th1.tid)
) dalam subkueri lain (SELECT id FROM (...)
), kami mencipta jadual terbitan sementara (x
). MySQL kemudiannya boleh menggunakan jadual sementara ini dengan selamat dalam klausa DELETE
pernyataan WHERE
, dengan berkesan memintas sekatan asal.
Ringkasan
Walaupun MySQL mengenakan sekatan ke atas penggunaan subquery dalam DELETE
pernyataan, teknik subquery bersarang ini menawarkan penyelesaian praktikal untuk melaksanakan operasi pemadaman kompleks yang sebaliknya akan disekat oleh peraturan sintaks standard.
Atas ialah kandungan terperinci Bagaimana untuk Mengatasi Sekatan Subquery Pernyataan DELETE MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!