一度にいくつかのテーブルから削除しようとしています。私は少し研究をして、これを思いつきました
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の近くで使用する正しい構文を確認してください。
これまでクロステーブルの削除を行ったことがないので、今のところは経験がなくて立ち往生しています!
私は何を間違えていますか?
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%です。
これはpets
とpets_activities
の間の単純な親/子関係であるように見えるため、削除カスケードを使用して外部キー制約を作成する方が適切です。
これにより、pets
行が削除されると、それに関連付けられているpets_activities
行も自動的に削除されます。
その後、クエリは簡単になります。
delete from `pets`
where `order` > :order
and `pet_id` = :pet_id
これを使って
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
現時点でテストする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の新しいバージョンに限定されていると思います。
構文は私には正しく見えます... INNER JOINを使用するように変更してみてください...
これを見てください: http://www.electrictoolbox.com/article/mysql/cross-table-delete/
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]