125

一度にいくつかのテーブルから削除しようとしています。ちょっと調べてみた結果、これにたどり着きました

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

ただし、このエラーが発生しています

Uncaught Database_Exception [ 1064 ]: SQL 構文にエラーがあります。pets_activitiesnear 'p, pa...を使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

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

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

4

7 に答える 7

228

ステートメントで aJOINを使用します。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

これを参照してください。

EXISTS参照整合性を備えた単一のテーブルの削除の場合、NOT EXISTSIN、などを使用する他の方法がありますNOT IN。しかし、節の前にエイリアスを使用して削除するテーブルを指定する上記の方法でFROMは、いくつかの非常にタイトな問題から抜け出すことができます。より簡単に見つけます。私は 99% のケースで連絡を取る傾向がありEXISTSますが、この MySQL 構文に 1 日かかるケースが 1% あります。

于 2012-07-11T21:56:33.623 に答える
21

petsこれはとの間の単純な親子関係のように見えるためpets_activities、削除カスケードを使用して外部キー制約を作成することをお勧めします。

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

次に、クエリは単純になります。

delete from `pets`
    where `order` > :order
      and `pet_id` = :pet_id
于 2010-07-26T03:17:56.560 に答える
16

これを使って

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
于 2015-02-20T05:08:33.517 に答える
3

現在テストする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に限定されていると思います。

于 2010-07-26T03:51:28.410 に答える
2

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

これを見てください。

于 2010-07-26T03:13:41.657 に答える
1

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]
于 2017-10-23T08:38:31.503 に答える
1

MySQL DELETE JOINステートメントを使用して複数のテーブルからデータを削除する方法を説明しているこの記事を見つけました。

ここに画像の説明を入力

于 2020-02-15T10:28:36.803 に答える