DEFAULT to wartość, która zostanie wstawiona w przypadku braku jawnej wartości w instrukcji wstawiania / aktualizowania. Załóżmy, że Twój DDL nie ma ograniczenia NOT NULL, problem wynika z tego - że kolumna nie będzie nigdy NOT NULL bo jeśli nie zostanie wprowadzona wartość od użytkownika, to DEFULT zawsze WYKONUJE SIĘ PRZED SPRAWDZENIEM NOT NULL.
id_miasta serial NOT NULL,
jeśli robisz serial, to nie robisz NOT NULL bo
SERIAL to alias dla BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.
Tworzysz FOREIGN KEY pamiętaj żę tabela do której się ODWOŁUJESZ musi już istnieć wcześniej.
REFERENCES (id_panstwa) - tu masz błąd? nie wskazałeś tabeli :)
REFERENCES NAZWA_TABELI(id_panstwa)
Składnia
Ograniczenie w jednym polu:
CONSTRAINT nazwa {PRIMARY KEY | UNIQUE | NOT NULL |
REFERENCES tabelaobca [(poleobce1, poleobce2)]
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}
Ograniczenie w wielu polach:
CONSTRAINT nazwa
{PRIMARY KEY (klucz_podstawowy1[, klucz_podstawowy2 [, ...]]) |
UNIQUE (klucz_unikatowy1[, klucz_unikatowy2 [, ...]]) |
NOT NULL (pole_niepuste1[, pole_niepuste2 [, ...]]) |
FOREIGN KEY [NO INDEX] (odw1[, odw2 [, ...]]) REFERENCES tabelaobca [(pole_tabeli_obcej1 [, pole_tabeli_obcej2 [, ...]])]
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}