Problema:
Vuoi conoscere i nomi predefiniti dei vincoli in una tabella in PostgreSQL.
Esempio:
Nel nostro database creiamo due tabelle, country
e student
, con i seguenti vincoli:PRIMARY KEY
(la colonna id
nelle tabelle country
e student
), FOREIGN KEY
(la colonna country_id
nella tabella student
), DEFAULT
(la colonna name
nella tabella student
), UNIQUE
(la colonna name
nella tabella country
e la colonna personal_number
nella tabella student
), e CHECK
(la colonna age
nella tabella student
).
Soluzione:
CREATE TABLE country ( id int NOT NULL primary key, name varchar(100) UNIQUE ); CREATE TABLE student ( id int NOT NULL primary key, name varchar(100) NOT NULL DEFAULT 'unknown', personal_number varchar(100) UNIQUE, age int CHECK(age>15), country_id int, FOREIGN KEY(country_id) references country(id) );
Mostriamo come PostgreSQL nomina i vincoli di queste tabelle per impostazione predefinita. Usa questa query per vederli:
SELECT conname, contype FROM pg_catalog.pg_constraint;
Ecco il risultato:
conname | contipo |
---|---|
paese_pkey | p |
country_name_key | tu |
controllo_età_studente | c |
chiave_studente | p |
chiave_numero_personale_studente | tu |
student_country_id_fkey | f |
Discussione:
Quando creiamo le nostre tabelle, impostiamo dei vincoli per alcune colonne. Tuttavia, non specifichiamo i nomi per questi vincoli, quindi sono nominati per impostazione predefinita in PostgreSQL. Come vengono generati i nomi predefiniti per i vincoli?
In PostgreSQL, i tipi di vincolo predefiniti sono p
, f
, u
e c
.
La PRIMARY KEY
è denominato per impostazione predefinita con il nome della tabella, un trattino basso ('_
') e 'pkey
'. Nella nostra tabella dei risultati sopra, puoi vedere due PRIMARY KEY
nomi (digitare 'p
') – uno dal nome country_pkey
nel country
table e un altro dal nome student_pkey
nello student
tabella.
Una FOREIGN KEY
è indicato dal tipo di vincolo 'f
'. Il suo nome è generato dal nome della tabella corrente, un trattino basso ('_
') , il nome della colonna, un altro carattere di sottolineatura ('_
') e 'fkey
'. Nel nostro esempio, il nome del vincolo di chiave esterna è student_country_id_fkey
, perché la colonna country_id
nella tabella student
è una chiave esterna.
Il nome predefinito per un CHECK
il vincolo è simile a quello di una chiave esterna, solo che è del tipo di vincolo 'c
'. Nel nostro esempio, la colonna age
nella tabella student
ha questo vincolo, quindi il nome del vincolo predefinito è student_age_check
.
Il nome predefinito per un UNIQUE
vincolo (digitare 'u
') è il nome della tabella, un trattino basso ('_
'), il nome della colonna, un altro carattere di sottolineatura ('_
') e 'key
'. Nel nostro esempio, la tabella student
ha un UNIQUE
vincolo denominato student_personal_number_key
. Per più colonne in un vincolo, il nome segue una convenzione simile ma contiene i nomi di tutte le colonne nella definizione del vincolo.