Mam następujące tabele,
CREATE TABLE users (id int PRIMARY KEY);
-- already exists with data
CREATE TABLE message ();
Jak zmienić messages
tabelę tak, aby
sender
dodawana jest do niej nowa kolumna o nazwie- gdzie
sender
jest klucz obcy odnoszący się dousers
tabeli
To nie zadziałało
# ALTER TABLE message ADD FOREIGN KEY (sender) REFERENCES users;
ERROR: column "sender" referenced in foreign key constraint does not exist
Czy to stwierdzenie również nie tworzy kolumny?
postgresql
foreign-key
alter-table
Hassan Baig
źródło
źródło
Odpowiedzi:
Co jest stosunkowo łatwe - wystarczy dodać kolejny krok.
FOREIGN KEY
Kolumna musi istnieć , aby uczynić goFK
. Wykonałem następujące czynności ( stąd i dokumentacja ):Kilka punktów do zapamiętania:
ZAWSZE nadawaj swoim kluczom obcym sensowne nazwy. Powiadomienie o naruszeniu klucza „SYS_C00308108” nie jest zbyt pomocne. Zobacz skrzypce tutaj dla zachowania Oracle w tych okolicznościach, nazwa klucza będzie się różnić między skrzypcami, ale jest to dowolny ciąg znaków rozpoczynający się od SYS _...)
Biorąc pod uwagę twoje oświadczenie:
Byłoby „miło mieć”, gdyby RDBMS mógł automatycznie utworzyć żądane pole z typem danych pasującym do pola, do którego się odwołuje. Powiedziałbym tylko, że zmiana DDL jest (a przynajmniej powinna być) rzadko używaną operacją, a nie czymś, co chciałbyś robić regularnie. Ryzykuje również dodanie do już dość znacznej dokumentacji.
Przynajmniej PostgreSQL próbuje zrobić coś rozsądnego - łączy nazwę tabeli, nazwę
FOREIGN KEY
pola,_fkey
a nawet dodaje,DETAIL: Key (sender_id)=(56) is not present in table "user_".
aby dać coś, co może mieć sens dla człowieka - patrz skrzypce tutaj .źródło
"y_z_fkey"
. Będę argumentować, że to lepsze niż nazway_x_fkey
, ponieważ naruszenie nie powiedzieć, kolumna jesteś wstawianie w który jest przyczyną błędu. Nie dbam o to, gdzie to wskazuje. Zgodnie z ogólną zasadą NIGDY nie należy nazywać swoich kluczy i pozwolić domyślnym PostgreSQL na obsługę.ON UPDATE CASCADE ON DELETE CASCADE;
w przykładzie, szczególnie bez powodu. To sprawia, że przykład jest bardziej złożony i nie zawracasz sobie głowy wyjaśnianiem, co to jest. Po pierwsze, zwykle nie chcę kaskadowego usuwania.y_x_fkey
luby_z_fkey
czyx__y_FK
, o ile jest ona zgodna.Nie jestem pewien, dlaczego wszyscy mówią ci, że musisz to zrobić w dwóch krokach. W rzeczywistości nie . Próbowałeś dodać,
FOREIGN KEY
który zakłada, że z założenia kolumna jest i zgłasza ten błąd, jeśli kolumny nie ma. Jeśli dodaszCOLUMN
, możesz jawnie zmienić goFOREIGN KEY
na tworzenie za pomocąREFERENCES
,Będzie działać dobrze. Możesz zobaczyć składnię
ALTER TABLE
tutaj,Z „akcji” jako,
Te przykłady są nawet w dokumentach,
Ale to wszystko nie jest potrzebne, ponieważ możemy polegać na autonamingach i rozwiązywaniu klucza podstawowego (jeśli podana jest tylko nazwa tabeli, to odwołujesz się do klucza podstawowego).
źródło
PRZYPADEK 1: Jeśli musisz utworzyć klucz obcy podczas tworzenia nowej tabeli
Powyższe polecenia utworzą tabelę o nazwie „table1” i trzema kolumnami o nazwie „id” (klucz podstawowy), „column1”, „table2_id” (klucz obcy tabeli 1, który odwołuje się do kolumny id tabeli 2).
DATATYPE „serial” sprawi, że kolumna, która używa tego typu danych jako kolumna automatycznie wygenerowana, podczas wstawiania wartości do tabeli nie musisz wcale wspominać o tej kolumnie, lub możesz podać „default” bez cudzysłowów w miejscu wartości.
Kolumna klucza podstawowego jest zawsze dodawana do indeksu tabeli o wartości „tablename_pkey”.
Jeśli klucz obcy zostanie dodany w czasie tworzenia tabeli, OGRANICZENIE zostanie dodane ze wzorcem „(nazwa_tabeli_tabeli) _ (nazwa_obcięcia_domeny) _fkey”.
Dodając klucz obcy, musimy wprowadzić słowo kluczowe „ODNIESIENIA” obok nazwy kolumny, ponieważ chcemy powiedzieć postgresowi, że ta kolumna odwołuje się do tabeli, a następnie obok odniesień musimy podać tabelę w celach informacyjnych, aw nawiasach podać nazwa kolumny przywoływanej tabeli, zwykle klucze obce są podawane jako kolumny klucza podstawowego.
PRZYPADEK 2: Jeśli chcesz mieć klucz obcy do istniejącej tabeli w istniejącej kolumnie
UWAGA: nawiasy kwadratowe „()” po KLUCZU ZAGRANICZNYM i REFERENCJE tabela2 są obowiązkowe, w przeciwnym razie postgres zgłosi błąd.
źródło
Znam problem. Nazwy kolumn są różne. Być może w jednej kolumnie znajduje się spacja po nazwie kolumny, więc upewnij się, że nazwy kolumn zostały nazwane dokładnie tak samo.
źródło