7 Stimmen

Handhabung der Datenbankintegrität

Ich führe in der nächsten Version meiner Anwendung die Datenbankintegrität mithilfe von innodb-Einschränkungen ein. Alles läuft gut, aber einige meiner Tabellen haben Datensätze mit gelöschten Referenzen (tote Datensätze) und deshalb kann ich der Tabelle keine Constraints hinzufügen.

Ich versuche es:

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

Und ich verstehe:

#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)

Bei dieser Abfrage habe ich festgestellt, dass über 500 Datensätze keine Referenzen haben (die Autoren wurden gelöscht, aber ihre Artikel blieben erhalten):

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

Bevor ich also eine Einschränkung hinzufügen kann, muss ich mich mit diesen befassen. Wie kann ich alle Datensätze löschen, die ich mit der obigen Abfrage erhalte?

Ich habe es versucht:

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

Aber mysql antwortet:

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

Für jede Hilfe wäre ich sehr dankbar.

14voto

Ken Downs Punkte 4609

Ich bin nicht allzu vertraut mit mySql's viele Macken, aber dies sollte auch funktionieren, und vielleicht mySql wird nicht auf es zu ersticken:

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

Natürlich haben wir immer eine Sicherungskopie der Tabelle, bevor wir Löschungen auf der Grundlage von Mengen vornehmen :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X