2013-08-02 18 views
7

Próbuję zrobić aktualizację schematu używając komendy app/console doctrine:schema:update --force, ale doktryna nie działa na następującej części:zmiana schematu Doctrine nie na obcej klucza

An exception occurred while executing 'DROP INDEX IDX_E98F2859A074D5D7 ON contract':        
SQLSTATE[HY000]: General error: 1553 Cannot drop index 'IDX_E98F2859A074D5D7': needed in a foreign key constraint 

To trywialne rozwiązania według another SO question. Tabela zawiera:

KEY `IDX_E98F2859A074D5D7` (`some_table_id`), 
CONSTRAINT `FK_E98F2859A074D5D7` FOREIGN KEY (`some_table_id`) REFERENCES `some_table` (`id`) 

Można to rozwiązać ręcznie, usuwając pasujące wiązanie. Ale czy istnieje sposób, aby zrobić to automatycznie?

+0

masz FK na którym stole i co dokładnie robisz, dla którego ten błąd jest zgłaszany? –

+0

@Sonali Mam nadzieję, że udzielono odpowiedzi (doktryna: schemat: aktualizacja). Indeks jest usuwany przez aktualizację schematu, ale klucz obcy nie jest usuwany przed nim. – viraptor

+0

Myślę, że będziesz musiał usunąć FK i dodać go ponownie. Przepraszam, jeśli się mylę ... –

Odpowiedz

7

Jeśli korzystasz ze schematu informacyjnego, możesz z łatwością utworzyć potrzebne komendy ALTER TABLE; odpowiednie tabele są tutaj: SCHEMA KEY_COLUMN_USAGE i STATISTICS.

Poniżej przykład dla zapytania, które generuje DDL:

SELECT CONCAT('ALTER TABLE ',kcu.TABLE_NAME,' DROP FOREIGN KEY ', kcu.CONSTRAINT_NAME,';') AS ddl 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu, INFORMATION_SCHEMA.STATISTICS stat 
WHERE stat.table_schema = 'your_schema' 
AND kcu.TABLE_NAME = stat.TABLE_NAME 
AND kcu.COLUMN_NAME = stat.COLUMN_NAME 
AND kcu.REFERENCED_TABLE_NAME IS NOT NULL 
INTO OUTFILE '/tmp/ddl.sql'; 

I można go uruchomić po przejrzeniu go przez uruchomienie tej klauzuli:

SOURCE '/tmp/ddl.sql'; 

Powyższe stwierdzenie wyszuka ograniczenie nazwa i odpowiednia nazwa tabeli dla każdego wiązania klucza obcego, gdy indeks istnieje w tej samej kolumnie klucza obcego w tej samej tabeli. Wynik jest przechowywany w pliku podanym przez INTO OUTFILE.

Przeczytaj uważnie powyższe stwierdzenie przed uruchomieniem wygenerowanego pliku ddl.

+0

Zauważ, że jeśli masz klucze, które się do siebie odwołują, usunięcie pierwszego powoduje usunięcie obu, i pojawia się błąd przy próbie usunięcia drugiego. –

+0

Kopiuję i wklejam instrukcje do phpmyadmin, ale pierwsza linia już zawiedzie z błędem: '# 1025 - Błąd przy zmianie nazwy" ./webbase/aanmelding "na" ./webbase/#sql2-472-c5 "(errno : 152) ' – rolandow