7

アプリケーションの次のバージョンでは、innodb 制約を使用してデータベースの整合性を導入しています。すべてうまくいきましたが、一部のテーブルには参照が削除されたレコード (デッド レコード) があり、それらが原因でテーブルに制約を追加できません。

やっています:

ALTER TABLE `article` ADD FOREIGN KEY (`author_id`) REFERENCES `authors` (`id`) ON DELETE CASCADE;

そして私は得る:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`books`.<result 2 when explaining filename '#sql-442_dc'>, CONSTRAINT `#sql-442_dc_ibfk_1` FOREIGN KEY (`author_id`) REFERENCES `authors` (`id`) ON DELETE CASCADE)

このクエリを実行すると、500 を超えるレコードに参照がないことがわかりました (著者は削除されましたが、記事は残っています)。

SELECT `articles`.`id`
FROM `articles` LEFT JOIN `authors` ON `articles`.`author_id` = `authors`.`id`
WHERE ISNULL(`authors`.`id`);

したがって、制約を追加する前に、それらに対処する必要があります。上記のクエリを使用して取得したすべてのレコードを削除するにはどうすればよいですか?

私はもう試した:

DELETE FROM `articles` WHERE `id` IN (
  SELECT `articles`.`id`
  FROM `articles` LEFT JOIN `authors` ON `articles`.`author_id` = `authors`.`id`
  WHERE ISNULL(`authors`.`id`);
)

しかし、mysql は次のように応答します。

You can't specify target table 'articles' for update in FROM clause

これに関するヘルプは大歓迎です。

4

1 に答える 1

14

私は mySql の多くの癖にあまり詳しくありませんが、これも機能するはずであり、おそらく mySql はそれで詰まらないでしょう:

delete from articles
 where not exists (
           select id from authors
            where authors.id = articles.author_id
       )

もちろん、セットベースの削除を試みる前に、常にテーブルのバックアップを取っています:)

于 2011-01-22T19:41:03.323 に答える