Co oznacza błąd mysql 1025 (HY000): błąd podczas zmiany nazwy „./foo” (nr błędu: 150)?

160

Próbowałem tego w mysql:

mysql> alter table region drop column country_id;

I mam to:

ERROR 1025 (HY000): Error on rename of './product/#sql-14ae_81' to
'./product/region' (errno: 150)

Jakieś pomysły? Klucz obcy?

Trenton
źródło
@skiphoppy - Czy próbujesz przyznać nagrodę za już udzieloną odpowiedź? Czy to w ogóle dozwolone? A może Twój przypadek jest inny, w którym przypadku powinieneś rozpocząć kolejny wątek?
Rick James,
@RickJames Tak, to jest. Skiphoppy powinna jednak dodać swój komentarz pod odpowiedzią, którą wybrała, ponieważ wiadomość o bouty zniknie po zakończeniu nagrody.
RandomSeed

Odpowiedzi:

240

Zwykle pojawia się ten błąd, jeśli Twoje tabele korzystają z silnika InnoDB. W takim przypadku musiałbyś porzucić klucz obcy, a następnie zmienić tabelę i usunąć kolumnę.

Ale trudna część polega na tym, że nie można usunąć klucza obcego przy użyciu nazwy kolumny, ale zamiast tego trzeba byłoby znaleźć nazwę używaną do indeksowania. Aby to znaleźć, wybierz następujące opcje:

POKAŻ STWÓRZ TABELĘ region;

Powinno to pokazać nazwę indeksu, na przykład:

OGRANICZANIE region_ibfk_1ZAGRANICZNEGO KLUCZA ( country_id) REFERENCJE country( id) O USUŃ ŻADNEJ AKCJI PRZY AKTUALIZACJI BRAK AKCJI

Teraz wystarczy wydać:

zmień region tabeli usuń klucz obcy region_ibfk_1;

I wreszcie:

zmiana regionu tabeli drop kolumna country_id;

I jesteś gotowy!

Jeshurun
źródło
Zauważ, że możesz również upuścić klucz obcy i kolumnę w jednym zapytaniu ALTER TABLE;
Valentin Grégoire
miły! powinniśmy porzucić klucz obcy, wszystko będzie dobrze! Dzięki!
Luan D
173

Rzeczywiście jest to błąd klucza obcego, możesz dowiedzieć się za pomocą błędu:

shell$ perror 150
MySQL error code 150: Foreign key constraint is incorrectly formed

Aby dowiedzieć się więcej o tym, co się nie powiodło, możesz skorzystać SHOW ENGINE INNODB STATUSz sekcji NAJNOWSZY BŁĄD KLUCZA ZAGRANICZNEGO, która zawiera szczegółowe informacje o tym, co jest nie tak.

W twoim przypadku najprawdopodobniej jest to spowodowane tym, że coś odwołuje się do kolumny country_id.

Harrison Fisk
źródło
2
Ponownie, kolejny mylący błąd wyświetlany w MySQL ... Dzięki.
e2-e4
W phpMyAdmin możesz znaleźć status silnika w Storage Engines , InnoDB , InnoDB Status
Maxence
15

Możesz również otrzymać ten błąd, próbując upuścić nieistniejący klucz obcy. Dlatego porzucając klucze obce, zawsze upewnij się, że faktycznie istnieją.

Jeśli klucz obcy istnieje, a nadal pojawia się ten błąd, spróbuj wykonać następujące czynności:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

// Upuść tutaj klucz obcy!

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

To zawsze działa dla mnie :)

Jeroen
źródło
1
Potrzebowałem tego podczas przełączania się na inny zestaw znaków tabeli, z powodu błędu mysql: ERROR 1025 (HY000): Error on rename of './table/#sql-14ae_81' to (errno: 150)
letsjump
7

Po prostu uruchom zapytanie alter table za pomocą „KEY” zamiast „FOREIGN KEY” w instrukcji drop. Mam nadzieję, że pomoże to rozwiązać problem i usunie ograniczenie związane z kluczem obcym i będzie można zmienić kolumny tabeli i usunąć tabelę.

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

tutaj DROP KEYzamiast DROP FOREIGN KEY,

mam nadzieję, że to pomoże.

Dzięki

Muhammad Sohail
źródło
4

Wiem, to jest stary post, ale to pierwsze trafienie w ulubioną wyszukiwarkę wszystkich, jeśli szukasz błędu 1025.

Istnieje jednak łatwy sposób na rozwiązanie tego problemu:

Zanim wykonasz swoje polecenia, musisz najpierw wyłączyć sprawdzanie ograniczeń klucza obcego za pomocą tego polecenia:

SET FOREIGN_KEY_CHECKS = 0;

Następnie możesz wykonać swoje polecenie (polecenia).

Po zakończeniu nie zapomnij ponownie włączyć sprawdzania ograniczeń klucza obcego, używając tego polecenia:

SET FOREIGN_KEY_CHECKS = 1;

Powodzenia w twoim przedsięwzięciu.

Baccata
źródło
Miałem problemy z instalacją octobercms na xampp, w końcu to pomogło.
jahackbeth
2

Miałem kiedyś podobne problemy. Usunąłem klucz podstawowy z TABELI A, ale kiedy próbowałem usunąć kolumnę klucza obcego z tabeli BI, pokazał powyższy ten sam błąd.

Nie możesz upuścić klucza obcego przy użyciu nazwy kolumny i aby ominąć to w PHPMyAdmin lub w MySQL, najpierw usuń ograniczenie klucza obcego przed zmianą nazwy lub usunięciem atrybutu.

Joomler
źródło
1

Zajrzyj do pliku błędów swojej bazy danych mysql. Według Bug # 26305 mój sql nie podaje przyczyny. Ten błąd istnieje od MySQL 4.1 ;-)

marabol
źródło
Uważam, że niektóre z Twoich odpowiedzi są trudne do zrozumienia, ale +1 za link do raportu o błędzie. Wygląda na to, że został naprawiony w MySQL 5.6.6. :)
mwfearnley
1

Jeśli używasz klienta takiego jak MySQL Workbench, kliknij prawym przyciskiem myszy żądaną tabelę, z której ma zostać usunięty klucz obcy, a następnie wybierz kartę klucza obcego i usuń indeksy.

Następnie możesz uruchomić zapytanie w ten sposób:

alter table table_name drop foreign_key_col_name;
iltaf khalid
źródło
1

Prawdopodobnie istnieje inna tabela z kluczem obcym odwołującym się do klucza podstawowego, który próbujesz zmienić.

Aby dowiedzieć się, która tabela spowodowała błąd, możesz uruchomić, SHOW ENGINE INNODB STATUSa następnie przejrzeć LATEST FOREIGN KEY ERRORsekcję

Użyj kategorii SHOW CREATE TABLE, aby wyświetlić nazwę ograniczenia.

Najprawdopodobniej będzie to Categories_ibfk_1

Użyj nazwy, aby najpierw upuścić klucz obcy, a następnie kolumnę:

ALTER TABLE categories DROP FOREIGN KEY categories_ibfk_1;
ALTER TABLE categories DROP COLUMN assets_id;
youngdero
źródło
1

Robić

SET FOREIGN_KEY_CHECKS=0;

zanim Operacja też może załatwić sprawę.

Jan Tchärmän
źródło
0

Domyślam się, że problem z ograniczeniem klucza obcego. Czy country_id jest używany jako klucz obcy w innej tabeli?

Nie jestem guru DB, ale myślę, że rozwiązałem taki problem (gdzie było ograniczenie fk), usuwając fk, robiąc moje alter-table, a następnie przerabiając fk.

Chciałbym usłyszeć, jaki jest wynik - czasami mysql jest dość tajemniczy.

itsmatt
źródło
MySQL może być okropny. Zwykle dobrze, ale te komunikaty o błędach, sheesh. Jeśli otrzymamy zwięzłe wyjaśnienie od kogoś z biura, podrzucę to tutaj.
Trenton
0

W moim przypadku korzystałem z MySQL i napotkałem ten sam problem podczas upuszczania jednej z moich kolumn w tabeli. Nie mogłem znaleźć nazwy klucza obcego. Wykonałem następujące kroki, aby rozwiązać problem:

  1. Rt. kliknij swój schemat i wybierz „Inspektor schematów”. Daje to różne tabele, kolumny, indeksy itp.

  2. Przejdź do zakładki „Indeksy” i wyszukaj nazwę kolumny pod kolumną „Kolumna”. Po znalezieniu sprawdź nazwę tabeli dla tego rekordu pod nazwą kolumny „Tabela”. Jeśli pasuje do nazwy żądanej tabeli, zanotuj nazwę klucza obcego z kolumny o nazwie „Nazwa”.

  3. Teraz wykonaj zapytanie: ALTER table tableNamexx DROP KEY ForeignKeyName;

  4. Teraz możesz wykonać instrukcję drop, która powinna zostać wykonana pomyślnie.

Jatin Shashoo
źródło
0

Otrzymałem ten błąd z MySQL 5.6, ale nie miał on nic wspólnego z kluczami obcymi. Było to na komputerze z systemem Windows 7 Professional działającym jako serwer w małej sieci LAN.

Aplikacja kliencka wykonywała operację wsadową, która tworzy tabelę, wypełnia ją niektórymi danymi zewnętrznymi, a następnie wykonuje zapytanie łącząc się ze stałymi tabelami, a następnie usuwając tabelę „tymczasową”. Ta partia robi to około 300 razy, a ta konkretna procedura była wykonywana tydzień po tygodniu przez kilka lat, kiedy nagle otrzymujemy błąd 1025 Nie można zmienić nazwy problemu w losowym punkcie partii.

W moim przypadku aplikacja korzystała z 4 instrukcji DDL a następnie CREATE TABLE, po których następowały 3 CREATE INDEX, nie ma klucza obcego. Jednak tylko 2 indeksy zostały faktycznie utworzone, a nazwa rzeczywistego pliku .frm tabeli została zmieniona w momencie awarii.

Moim rozwiązaniem było pozbycie się oddzielnych instrukcji CREATE INDEX i utworzenie ich za pomocą instrukcji CREATE TABLE. To w chwili pisania tego tekstu rozwiązało problem dla mnie i mojej pomocy komuś innemu drapiącemu się po głowie, gdy znajdą ten wątek.

Chris Millard
źródło
-2

AverageRatings = FOREACH groupedRatings WYGENERUJ grupę AS movieID, AVG (ratings.rating) AS avgRating, COUNT (ratings.rating) AS numRatings;

Jeśli używasz polecenia jak powyżej, musisz użyć grupy małymi literami. To może rozwiązać twój problem, a mój. Przynajmniej w skrypcie PIG.

Naman Dhameja
źródło
Nie sądzę, że jest to związane z problemem, on lub ona uderza w problem z mysql
Zdenek Machek