Berikut ini skrip untuk membuat tabel saya:
CREATE TABLE clients (
client_i INT(11),
PRIMARY KEY (client_id)
);
CREATE TABLE projects (
project_id INT(11) UNSIGNED,
client_id INT(11) UNSIGNED,
PRIMARY KEY (project_id)
);
CREATE TABLE posts (
post_id INT(11) UNSIGNED,
project_id INT(11) UNSIGNED,
PRIMARY KEY (post_id)
);
Dalam kode PHP saya, ketika menghapus klien, saya ingin menghapus semua posting proyek:
DELETE
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id;
Tabel posting tidak memiliki kunci asing client_id
, hanya project_id
. Saya ingin menghapus posting di proyek yang telah lulus client_id
.
Ini tidak berfungsi sekarang karena tidak ada posting yang dihapus.
DELETE posts FROM posts JOIN projects ...
, bukanIN (subquery)
pola. (Jawaban dari Yehosef memberikan contoh pola yang disukai.)alias
untuk nama tabel dan menggunakannya.Jawaban:
Anda hanya perlu menentukan bahwa Anda ingin menghapus entri dari
posts
tabel:EDIT: Untuk informasi lebih lanjut Anda dapat melihat jawaban alternatif ini
sumber
DELETE d FROM posts AS d JOIN projects AS p ON ...
DELETE posts , projects FROM posts INNER JOIN projects ON projects.project_id = posts.project_id WHERE projects.client_id = :client_id
Karena Anda memilih beberapa tabel, Tabel yang akan dihapus tidak lagi ambigu. Anda harus memilih :
Dalam hal ini,
table_name1
dantable_name2
merupakan tabel yang sama, maka ini akan berfungsi:Anda bahkan dapat menghapus dari kedua tabel jika Anda ingin:
Perhatikan itu
order by
danlimit
tidak berfungsi untuk penghapusan multi-tabel .Perlu diketahui juga bahwa jika Anda mendeklarasikan alias untuk suatu tabel, Anda harus menggunakan alias saat merujuk ke tabel:
Kontribusi dari Carpetsmoker dan lain-lain .
sumber
ON
kapital. Untuk pengembang yang kurang berpengalaman, mungkin menyampaikan bahwa tidak masalah berantakan dan tidak konsisten dalam hal gaya.Atau hal yang sama, dengan sintaks (IMO lebih ramah) sedikit berbeda:
BTW, dengan mysql menggunakan bergabung hampir selalu jauh lebih cepat daripada subqueries ...
sumber
USING
: stackoverflow.com/questions/11366006/mysql-on-vs-usingAnda juga dapat menggunakan ALIAS seperti ini berfungsi hanya menggunakannya di database saya! t adalah tabel yang perlu dihapus!
sumber
Saya lebih terbiasa dengan solusi subquery untuk ini, tapi saya belum mencobanya di MySQL:
sumber
Catatan DELETE MySQL dengan GABUNG
Anda biasanya menggunakan INNER BERGABUNG dalam pernyataan SELECT untuk memilih catatan dari tabel yang memiliki catatan yang sesuai di tabel lain. Kami juga bisa menggunakan klausa INNER JOIN dengan pernyataan DELETE untuk menghapus rekaman dari tabel dan juga catatan yang sesuai di tabel lain misalnya, untuk menghapus catatan dari tabel T1 dan T2 yang memenuhi kondisi tertentu, Anda menggunakan pernyataan berikut:
Perhatikan bahwa Anda meletakkan nama tabel T1 dan T2 antara DELETE dan FROM. Jika Anda menghilangkan tabel T1, pernyataan DELETE hanya menghapus catatan di tabel T2, dan jika Anda menghilangkan tabel T2, hanya catatan di tabel T1 yang dihapus.
Kondisi gabungan T1.key = T2.key menentukan catatan yang sesuai dalam tabel T2 yang perlu dihapus.
Kondisi dalam klausa WHERE menentukan catatan mana dalam T1 dan T2 yang perlu dihapus.
sumber
Hapus Tabel Tunggal:
Untuk menghapus entri dari
posts
tabel:Untuk menghapus entri dari
projects
tabel:Untuk menghapus entri dari
clients
tabel:Hapus Beberapa Tabel:
Untuk menghapus entri dari beberapa tabel dari hasil yang digabungkan, Anda perlu menentukan nama tabel setelah
DELETE
daftar yang dipisahkan koma:Misalkan Anda ingin menghapus entri dari semua tiga tabel (
posts
,projects
,clients
) untuk klien tertentu:sumber
Coba seperti di bawah ini:
sumber
Metode lain untuk menghapus menggunakan sub pilih yang lebih baik daripada menggunakan
IN
akanWHERE
EXISTS
Salah satu alasan untuk menggunakan ini daripada bergabung adalah bahwa
DELETE
denganJOIN
melarang penggunaanLIMIT
. Jika Anda ingin menghapus dalam blok agar tidak menghasilkan kunci tabel penuh, Anda bisa menambahkanLIMIT
menggunakanDELETE WHERE EXISTS
metode ini .sumber
posts
EXISTS dalam () adalah samaposts
dengan baris yang dihapus. (DELETE p FROM posts p WHERE EXISTS ( SELECT 1 FROM projects WHERE projects.client_id = p.client_id);
HAPUS catatan dari satu tabel:
HAPUS RECORDS DARI kedua tabel:
sumber
Jika bergabung tidak bekerja untuk Anda, Anda dapat mencoba solusi ini. Ini untuk menghapus catatan anak yatim dari t1 ketika tidak menggunakan kunci asing + kondisi khusus. Yaitu menghapus catatan dari table1, yang memiliki "kode" bidang kosong dan yang tidak memiliki catatan di table2, cocok dengan bidang "nama".
sumber
Coba ini,
sumber
- Perhatikan bahwa Anda tidak dapat menggunakan alias di atas tabel tempat Anda perlu menghapus
sumber