web-dev-qa-db-ja.com

MySQLの複数のテーブルから削除する方法は?

一度にいくつかのテーブルから削除しようとしています。私は少し研究をして、これを思いつきました

DELETE FROM `pets` p,
            `pets_activities` pa
      WHERE p.`order` > :order
        AND p.`pet_id` = :pet_id
        AND pa.`id` = p.`pet_id`

しかし、私はこのエラーを受け取っています

キャッチされないDatabase_Exception [1064]:SQL構文にエラーがあります。 MySQLサーバーのバージョンに対応するマニュアルで、 'p、pets_activities paの近くで使用する正しい構文を確認してください。

これまでクロステーブルの削除を行ったことがないので、今のところは経験がなくて立ち往生しています!

私は何を間違えていますか?

105
alex

JOINステートメントでDELETEを使用します。

DELETE p, pa
      FROM pets p
      JOIN pets_activities pa ON pa.id = p.pet_id
     WHERE p.order > :order
       AND p.pet_id = :pet_id

または、使用することができます...

DELETE pa
      FROM pets_activities pa
      JOIN pets p ON pa.id = p.pet_id
 WHERE p.order > :order
   AND p.pet_id = :pet_id

... pets_activitiesからのみ削除するには

http://dev.mysql.com/doc/refman/5.0/en/delete.html を参照してください

単一のテーブルを削除するが、参照整合性がある場合、EXISTS、NOT EXISTS、IN、NOT INなどを使用する他の方法があります。ただし、FROM句を取得する前にエイリアスで削除するテーブルを指定する上記の方法いくつかの非常に狭い場所から簡単に移動できます。私はケースの99%でEXISTSに連絡する傾向があり、このMySQL構文が1日かかる場所は1%です。

189
cadman

これはpetspets_activitiesの間の単純な親/子関係であるように見えるため、削除カスケードを使用して外部キー制約を作成する方が適切です。

これにより、pets行が削除されると、それに関連付けられているpets_activities行も自動的に削除されます。

その後、クエリは簡単になります。

delete from `pets`
    where `order` > :order
      and `pet_id` = :pet_id
19
paxdiablo

これを使って

DELETE FROM `articles`, `comments` 
USING `articles`,`comments` 
WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4

または

DELETE `articles`, `comments` 
FROM `articles`, `comments` 
WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4
13
RN Kushwaha

現時点でテストするmysqlデータベースはありませんが、from句の前に削除するものを指定しようとしましたか?例えば:

DELETE p, pa FROM `pets` p,
        `pets_activities` pa
  WHERE p.`order` > :order
    AND p.`pet_id` = :pet_id
    AND pa.`id` = p.`pet_id`

使用した構文は、mysqlの新しいバージョンに限定されていると思います。

2
Brandon Horsley

構文は私には正しく見えます... INNER JOINを使用するように変更してみてください...

これを見てください: http://www.electrictoolbox.com/article/mysql/cross-table-delete/

2
Andre Gallo

2017年にこれを読んでいる人にとって、これは私が似たようなことをした方法です。

DELETE pets, pets_activities FROM pets inner join pets_activities
on pets_activities.id = pets.id WHERE pets.`order` > :order AND 
pets.`pet_id` = :pet_id

一般的に、複数のテーブルから行を削除するには、以下の構文を以下に示します。このソリューションは、2つのテーブル間に何らかの関係があるという仮定に基づいています。

DELETE table1, table2 FROM table1 inner join table2 on table2.id = table1.id
WHERE [conditions]
1