Mam 2 tabele, jak zobaczysz w moim kodzie posgresql poniżej. Pierwsza tabela uczniów ma dwie kolumny, jedną dla ucznia_nazwa, a drugą student_id, który jest kluczem podstawowym. W mojej drugiej tabeli o nazwie testy, zawiera ona 4 kolumny, jedną dla subject_id, jedną dla subject_name, a następnie jedną dla ucznia z najwyższym wynikiem z przedmiotu, który jest najwyższymStudent_id. próbuję, aby parametr najwyższyStudent_id odnosił się do student_id w tabeli moich uczniów. Oto kod, który mam poniżej, nie jestem pewien, czy składnia jest poprawna:
CREATE TABLE students ( student_id SERIAL PRIMARY KEY,
player_name TEXT);
CREATE TABLE tests ( subject_id SERIAL,
subject_name,
highestStudent_id SERIAL REFERENCES students);
czy składnia jest highestStudent_id SERIAL REFERENCES students
poprawna? ponieważ widziałem inny podobnyhighestStudent_id REFERENCES students(student_id))
Jaki byłby poprawny sposób tworzenia klucza obcego w postgresql?
serial
, jak powinnainteger
.serial
nie jest „prawdziwym” typem danych, to krótka ręka doOdpowiedzi:
Zakładając tę tabelę:
Istnieją cztery różne sposoby definiowania klucza obcego (w przypadku pojedynczej kolumny PK) i wszystkie prowadzą do tego samego ograniczenia klucza obcego:
W tekście bez wzmianki o kolumnie docelowej:
W wierszu ze wzmianką o kolumnie docelowej:
Poza linią wewnątrz
create table
:Jako osobne
alter table
oświadczenie:Który wolisz, to kwestia gustu. Ale powinieneś być konsekwentny w swoich skryptach. Ostatnie dwie instrukcje są jedyną opcją, jeśli masz klucze obce odwołujące się do PK, który składa się z więcej niż jednej kolumny - nie możesz w takim przypadku zdefiniować „inline” FK, np.
foreign key (a,b) references foo (x,y)
Tylko wersja 3) i 4) daje możliwość zdefiniowania własnej nazwy dla ograniczenia FK, jeśli nie podoba ci się te wygenerowane przez system z Postgres.
Typ
serial
danych tak naprawdę nie jest typem danych. Jest to po prostu krótka notacja ręczna, która definiuje domyślną wartość kolumny pobraną z sekwencji. Zatem każda kolumna odwołująca się do kolumny zdefiniowanej jakoserial
musi być zdefiniowana przy użyciu odpowiedniego typu podstawowegointeger
(lubbigint
dlabigserial
kolumn)źródło