2013-04-16 15 views
5

Pracuję z mysql i codeigniter za pomocą redbean ORM. Po wprowadzeniu klucza obcego dla wielu do wielu assosciation mam następujący błąd podczas uruchamiania:Jak testować tabele powiązane z kluczami obcymi?

drop TABLE IF EXISTS `temp` 

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

Potem wszedł SHOW InnoDB SILNIK STAN w phpMyAdmin. Dane wyjściowe obejmują:

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

Innymi słowy, inna tabela odwołuje się do FK. Do celów testowych myślę, że najlepszą rzeczą do zrobienia jest upuszczenie wszystkich powiązanych tabel i odtworzenie ich za pomocą kontrolera, który testuję. Czy to najlepsza droga? Próbowałem:

drop TABLE IF EXISTS `temp` `temp_workers` 

, ale nadal otrzymuję powyższy błąd, a polecenie upuszczania nie działa. Też:

truncate TABLE `temp`, `temp_workers` 

daje:

You have an error in your SQL syntax 
+0

Dlaczego po prostu nie "TRUNCATE"? – zerkms

+0

patrz edytuj na pytanie – user61629

+2

Spróbuj najpierw upuścić/skrócić temp_workers, ponieważ ma on ograniczenie FK do tabeli temp, a następnie do tabeli temp.. –

Odpowiedz

2

Jak wspomniano w komentarzach trzeba upuszczać żadnych tabel z FK contraints do innych tabel, po pierwsze, a następnie można usunąć tabele są powiązane.

przykład:

User 
    id: 1 
    name: Mike 

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

Ta konfiguracja jest mieszaninę 1: 1 związku (more on data normalization), gdzie jeden rząd użytkownik może odwoływać się do jednego rzędu adresu, a ponieważ hałas adres zależy od istnienia szeregu użytkownika jeśli spróbujesz usunąć wiersz użytkownika, zobaczysz wspomniane błędy.

Ale jeśli najpierw upuścisz tabelę adresów, wszystko działa zgodnie z oczekiwaniami, ponieważ tabela użytkownika nie jest powiązana z żadną inną tabelą.

Zapewnienie w swoim schemacie referential integrity zapewnia, że ​​nie będziesz miał osieroconych wierszy, które przenikają przez twoją aplikację opartą na danych.

Można również wydać następujące polecenia:

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

Ale ja zdecydowanie odradzam ten, jak można zerwać więzy integralności danych, a kończy się w prawdziwy bałagan. Widziałem, jak ktoś to robił w środowisku korporacyjnym, a oczyszczenie zajęło im tygodnie. Jednakże, jeśli robisz to dla celów testowania; jak pisanie testów jednostkowych, lub po prostu nauczyć, a ty nie chcesz usunąć tabele za każdym razem, można to zrobić:

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

Właściwa konstrukcja schematu za pomocą kluczy obcych idzie po drodze do budowania dobrą podstawę dla dowolna aplikacja wykorzystująca dane. To zajmie trochę czasu, aby uzyskać głowę, kiedy używać i jak skonstruować ograniczenia klucza obcego, ale z czasem zaczniesz rozumieć. Dobrym sposobem na rozpoczęcie jest pobranie projektu open source, takiego jak magento, wordpress lub vbulletin i przyjrzenie się ich schematom. Możesz nawet introspekować te schematy przy użyciu MySQL workbench i wyświetlać ich Entity-Relationship Diagrams (ERD), które wizualnie demonstrują połączenia między tabelami.

+0

Dzięki, świetna odpowiedź! – user61629

Powiązane problemy