2011-08-10 12 views
18

Mam CustomizationSet tabela z kolumnami:Dodawanie klucza obcego do istniejącej tabeli daje błąd 1050 tabela już istnieje

customization_set_guid (which is a non-nullable guid and also the primary key) 
creator_account_guid 
and a few others 

i stół z istniejącej rejestracji danych z kolumn:

registration_id (an int and the primary key) 
customization_set_guid (also a guid (so a char(36)) which is nullable, and all entries are currently null) 
and a few other columns 

Kiedy próbuję uruchomić i uruchomić w MySQL Workbench, daje błąd 1050Tabela ". \ Nazwa_błędu \ rejestracja "już istnieje.

Jeśli spróbuję użyć interfejsu użytkownika, aby dodać obce klucze za pomocą karty Klucze obce w oknie dialogowym Zmień tabelę, a następnie wybierz opcję Dostosowanie Ustaw jako tabelę, do której się odwołuje, to nie pozwala mi wybrać parametru customization_set_guid na liście kolumn.

Naprawdę nie jestem pewien, dlaczego nie pozwoli mi dodać tego klucza obcego. Właśnie udało mi się utworzyć klucze obce między właśnie dodanymi tabelami. Tabela Rejestracja istnieje na chwilę ...

Odpowiedz

2

Więc członek zespołu to rozgryzł. Jedna tabela została ustawiona na typ utf8_general, a druga została ustawiona na typ default. Nie sądziłem, że to był problem, ponieważ domyślnie jest to utf8_general, ale podobno mysql po prostu patrzy na nazwy typów, a nie na typ bazowy.

0

Nie jestem pewien, czy jest to literówka, ale nie powinny być

ALTER TABLE Registration ADD FOREIGN KEY 
(
    customization_set_guid 
) REFERENCES CustomizationSet (
    customization_set_guid 
); 

być coś

ALTER TABLE Registration ADD FOREIGN KEY 
customization_set_guid_fk (customization_set_guid) 
REFERENCES CustomizationSet (customization_set_guid); 
+0

która zwraca ten sam błąd. Inni kluczy obcych w innych tabelach i utworzone z tej składni pracowali, to po prostu dodaje domyślną nazwę klucza – avaleske

+0

Hmmm. Wydaje się, że ma coś do zrobienia "Tabela 1050". \ nazwa_bazy \ rejestracji ", a nie klucz obcy.Czy dodanie innego klucza obcego do innej tabeli działa dobrze? – ace

0

Nie jestem pewien stole już istnieje, ale powodem, dla którego nie pozwala wybrać żądanej kolumny, jest najprawdopodobniej ze względu na to, że kolumny nie są tego samego typu. Sprawdź, czy są one tego samego typu, tej samej długości i mają te same opcje.

+0

są zarówno char (36), ale w Regist racja jest nullable. Czy to miałoby znaczenie? – avaleske

8

Wystąpił ten sam błąd i wynikało to z faktu, że klucz obcy już istniał. Co chcesz tylko dodać ograniczenia:

ALTER TABLE Registration 
    ADD CONSTRAINT idx_Registration_CustomizationSet 
    FOREIGN KEY (customization_set_guid) 
    REFERENCES CustomizationSet(customization_set_guid); 
+2

Nie musisz. Mój problem polegał na tym, że to zrobiłem i po przeczytaniu zdałem sobie sprawę, że próbuję dodać istniejące już ograniczenie. Usunięcie ograniczenia powoduje, że MySQL przypisuje samą nazwę. To jest z http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html: "Jeśli podano klauzulę CONSTRAINT symbol, wartość symbolu musi być unikalna w bazie danych. Jeśli klauzula nie zostanie podana, InnoDB automatycznie utworzy nazwę. " – Nicsoft

+1

To faktycznie zadziałało dla mnie. Jawnie podanie ograniczenia zadziałało. Dziwne, ponieważ ta tabela nie miała żadnych ograniczeń. – Richard

+0

Zadziałało dla mnie, gdy podałem nazwę ograniczenia. Musiał kolidować z innym istniejącym ograniczeniem. – Magicode

2

Wygląda na to jest raport o błędzie do tego w MySQL znaleźć tutaj:

MySQL Bug 55296

W końcu myślę, że podnieśli swoje serwer i naprawił problem. Jednak z czytania tego nie wiem. Mieli kilka obejść jak umieszczanie w ograniczonych nazw/zmiana ich. Jeśli uważasz, że to jest to samo, chciałbym poprosić o ponowne otwarcie błędu.

W pewnym momencie wspominają, że typy nie pasują, a stół warsztatowy odpowiadał błędem (powinien to być errno 150 lub errno 121). Możesz zobaczyć przyczyny tych błędów tutaj: MySQL Foreign Key Errors and Errno 150

1

Mam ten sam błąd, a ponieważ moja sprawa nie została jeszcze wspomniana, opublikuję tę odpowiedź i mam nadzieję, że może to uratować komuś czas!

Moje dwa silniki stołów, gdzie różne. To był InnoDB, a drugi MyIsam.

Aby zmienić silnik z tabeli:

wybrać tabelę, uderzył alter table, a następnie uderzył podwójną strzałkę na prawo-większość Workbench (tak będzie skierowane do góry).

Teraz zmień silnik!

1
  • Sprawdź Storage typ silnika do stołu CustomizationSet.

miałem ten sam problem, ale mogę go rozwiązać, zmieniając typ silnika do InnoDB, ponieważ kilka typów nie obsługuje kluczy obcych.

0

Miałem podobny problem iw końcu to był problem z Integrity Constraint. Kolumna klucza obcego odwoływała się do zagranicznej kolumny, która nie istnieje .

Spróbuj uruchomić następujące czynności, aby sprawdzić, czy jest to przypadek:

select r.customization_set_guid, c.customization_set_guid 
from Registration r 
right join CustomizationSet c 
on 
r.customization_set_guid = c.customization_set_guid 
where isnull(c.customization_set_guid); 
0

Podczas korzystania MysqlWorkbench błąd jest mylące. Mój problem polegał na tym, że próbowałem dodać ograniczenie klucza obcego w tabeli, która już miała wiersze i jeden z wierszy był pusty (nie spełniał ograniczenia FK. Zamiast narzekać, że ograniczenie nie powiedzie się, jeśli zostanie zastosowane, MysqlWorkbench zgłosił, że tabela istnieje.

Usuwanie stałą wiersz przestępstwa (lub dodawanie i ograniczenie dopuszczalnej wartości pola) rozwiązało problem.

Powiązane problemy