2013-04-16 9 views
5

Ich arbeite mit mysql und coderigniter mit dem redbean ORM. einen Fremdschlüssel für viele zu viele Assosciation Nach der Implementierung bekam ich folgende Fehlermeldung, wenn ich laufen:Wie testen Sie Tabellen, die mit Fremdschlüsseln verknüpft sind?

drop TABLE IF EXISTS `temp` 

Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails thrown 

I SHOW ENGINE BDB STATUS in phpMyAdmin dann eingegeben. Die Ausgabe enthält:

LATEST FOREIGN KEY ERROR------------------------:  Cannot drop table `db1`.`temp`because it is referenced by `db1`.`temp_workers`. 

Mit anderen Worten, eine andere Tabelle verweist auf den FK. Zu Testzwecken denke ich, dass es am besten ist, alle zugehörigen Tabellen zu löschen und sie mit dem Controller, den ich gerade testet, neu zu erstellen. Ist das der beste Weg zu gehen? Ich habe versucht:

, aber ich bekomme immer noch den oben genannten Fehler, und der Drop-Befehl funktioniert nicht. Auch:

truncate TABLE `temp`, `temp_workers` 

gibt:

You have an error in your SQL syntax 
+0

Warum "schreit" du nicht einfach? – zerkms

+0

siehe zu Frage bearbeiten – user61629

+2

Versuchen Sie, zuerst temp_workers zu löschen/abzuschneiden, da es die FK-Einschränkung auf temporäre Tabelle und dann temporäre Tabelle hat. –

Antwort

2

Wie in den Kommentaren erwähnt Sie Tabellen mit FK contraints zu anderen Tabellen fallen haben, zuerst, dann können Sie die Tabellen fallen wird, verbunden.

Beispiel:

User 
    id: 1 
    name: Mike 

Address 
    id: 1 
    user_id: 1 (FK constraint to User.id table.column) 
    address_1: 555 Main Street 

Dieser Aufbau ist ein 1: 1-Beziehung (more on data normalization), wo ein Benutzer Zeile eine Zeilenadresse verweisen kann, und weil die Adresszeile auf der Existenz des Benutzers Reihe abhängig ist, Wenn Sie versuchen, die Benutzerzeile zu entfernen, werden die von Ihnen erwähnten Fehler angezeigt.

Wenn Sie jedoch zuerst die Adresstabelle löschen, funktioniert alles wie erwartet, da die Benutzertabelle für keine andere Tabelle FK ist.

Sicherstellen referential integrity innerhalb Ihres Schemas stellt sicher, dass Sie nicht mit verwaisten Zeilen enden, die durch Ihre datengesteuerte Anwendung durchdringen.

Sie könnten auch die folgenden Befehle:

SET foreign_key_checks = 0; 
# Do Stuff 
SET foreign_key_checks = 1; 

Aber ich würde gegen diese dringend raten, wie Sie die referentielle Integrität Ihrer Daten brechen könnte, und in einem echten Chaos enden. Ich habe jemanden in einer Unternehmensumgebung gesehen, und es hat Wochen gedauert, sie zu bereinigen. Wenn Sie dies jedoch tun STRIKT zu Testzwecken; wie Unit-Tests schreiben, oder nur zu lernen, und du hast nicht die Tabellen jedes Mal löschen möchten, können Sie dies tun:

# Because we remove the foreign key check, we can truncate in any order 
SET foreign_key_checks = 0; 
TRUNCATE TABLE user; 
TRUNCATE TABLE address; 
SET foreign_key_checks = 1; 

Proper Schema-Design eine gute Grundlage für den Aufbau für Fremdschlüssel-Constraints geht entlang Weg mit jede datengesteuerte Anwendung. Es wird eine Weile dauern, bis man sich überlegt, wann man es verwenden soll und wie man Fremdschlüssel-Constraints konstruiert, aber mit der Zeit werden Sie anfangen zu verstehen. Ein guter Weg, um loszulegen, ist ein Open-Source-Projekt wie magento, wordpress oder vbulletin herunterladen und schauen Sie sich ihre Schemas. Sie können diese Schemas sogar unter Verwendung von MySQL workbench untersuchen und deren Entity-Relationship Diagrams (ERDs) anzeigen, die Links zwischen Tabellen visuell demonstrieren.

+0

Danke, eine gute Antwort! – user61629

Verwandte Themen