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.