MySQL birden çok tablodan satır silme

5 Cevap php

İşte ben yapmaya çalışıyorum budur:

projects masa ve images tabloda bu proje ile ilişkili tüm görüntüleri bir projeyi silmek.

Diyelim $del_id = 10

DELETE FROM projects, images WHERE projects.p_id = '$del_id' AND images.p_id = '$del_id'

Ne bu sorgu ile yanlış?

5 Cevap

$sql = "DELETE FROM projects, images WHERE projects.p_id = '".$del_id."' or images.p_id = '".$del_id."'";

Silinen zaman, bir öğe bu nedenle olmalı, ikisi de bu gereksinimleri karşılamak asla OR değil AND

Chacha102 noted, sizin sorgu sorunu WHERE maddesinde AND olduğu gibi.

Ancak, ben okumak daha kolay bulabilirsiniz çoklu masa DELETE s, için JOIN sözdizimi kullanmak isteyebilirsiniz:

DELETE     projects, images
FROM       projects 
LEFT JOIN  images ON images.p_id = projects.p_id
WHERE      projects.p_id = 10;

Bunu yapmak için iki ayrı sorgu kullanmanız gerekir:

delete from images where p_id = 123;

delete from projects where p_id = 123;

yani:

  • İlk olarak, projeye bağlı görüntüleri, (foreign key ? ) silmek
  • Ve, hiçbir şey artık proje bağlıdır zaman, projeyi kendisi silin.


And, as a security precaution, you should wrap all this in a transaction, to get a all or nothing behavior -- well, if you are using a storage engine that suppors transactions, like InnoDb.

MySQL Kılavuzunda, bu konuda, 12.3.1. START TRANSACTION, COMMIT, and ROLLBACK Syntax bakın.

Bir ameliyathaneye ve Değişim.

Sen bir ardarda, çok daha kolay silmek ile bir yabancı anahtar kısıtlaması kullanmak isteyebilirsiniz, ancak InnoDB kullanmak ve bu FK-kısıtlaması oluşturmak zorunda. Projeyi silmek ve ilgili tüm görüntüler de silinecektir.

(Yanlış cevap, MySQL allows this)

Bir sorguda iki tablodan silemezsiniz.

Alabilirsiniz yakın bir işlemde iki siler sarın olduğunu:

begin transaction
delete from projects where p_id = $del_id
delete from images where p_id = $del_id
commit transaction