PostgreSQL - VINCOLI

I vincoli sono le regole applicate alle colonne di dati nella tabella. Questi vengono utilizzati per impedire che dati non validi vengano inseriti nel database. Ciò garantisce l'accuratezza e l'affidabilità dei dati nel database.

I vincoli possono essere a livello di colonna o di tabella. I vincoli a livello di colonna vengono applicati solo a una colonna mentre i vincoli a livello di tabella vengono applicati all'intera tabella. La definizione di un tipo di dati per una colonna è di per sé un vincolo. Ad esempio, una colonna di tipo DATE vincola la colonna a date valide.

I seguenti sono vincoli comunemente usati disponibili in PostgreSQL.

  • NOT NULL Constraint - Assicura che una colonna non possa avere un valore NULL.

  • UNIQUE Constraint - Assicura che tutti i valori in una colonna siano diversi.

  • PRIMARY Key - Identifica in modo univoco ogni riga / record in una tabella di database.

  • FOREIGN Key - Vincola i dati in base alle colonne di altre tabelle.

  • CHECK Constraint - Il vincolo CHECK garantisce che tutti i valori in una colonna soddisfino determinate condizioni.

  • EXCLUSION Constraint - Il vincolo EXCLUDE garantisce che se due righe qualsiasi vengono confrontate sulle colonne o espressioni specificate utilizzando l'operatore o gli operatori specificati, non tutti questi confronti restituiranno TRUE.

Vincolo NOT NULL

Per impostazione predefinita, una colonna può contenere valori NULL. Se non si desidera che una colonna abbia un valore NULL, è necessario definire tale vincolo su questa colonna specificando che NULL non è ora consentito per quella colonna. Un vincolo NOT NULL viene sempre scritto come vincolo di colonna.

Un NULL non è la stessa cosa di nessun dato; piuttosto, rappresenta dati sconosciuti.

Esempio

Ad esempio, la seguente istruzione PostgreSQL crea una nuova tabella denominata COMPANY1 e aggiunge cinque colonne, tre delle quali, ID e NAME e AGE, specificano di non accettare valori NULL -

CREATE TABLE COMPANY1(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

Vincolo UNICO

Il vincolo UNIQUE impedisce a due record di avere valori identici in una determinata colonna. Nella tabella AZIENDA, ad esempio, potresti voler impedire a due o più persone di avere la stessa età.

Esempio

Ad esempio, la seguente istruzione PostgreSQL crea una nuova tabella denominata COMPANY3 e aggiunge cinque colonne. Qui, la colonna AGE è impostata su UNIQUE, quindi non puoi avere due record con la stessa età -

CREATE TABLE COMPANY3(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL UNIQUE,
   ADDRESS        CHAR(50),
   SALARY         REAL    DEFAULT 50000.00
);

PRIMARY KEY Vincolo

Il vincolo PRIMARY KEY identifica in modo univoco ogni record in una tabella di database. Possono esserci più colonne UNICHE, ma solo una chiave primaria in una tabella. Le chiavi primarie sono importanti quando si progettano le tabelle del database. Le chiavi primarie sono ID univoci.

Li usiamo per fare riferimento alle righe della tabella. Le chiavi primarie diventano chiavi esterne in altre tabelle, quando si creano relazioni tra tabelle. A causa di una "supervisione di codifica di lunga data", le chiavi primarie possono essere NULL in SQLite. Questo non è il caso di altri database

Una chiave primaria è un campo in una tabella, che identifica in modo univoco ogni riga / record in una tabella di database. Le chiavi primarie devono contenere valori univoci. Una colonna di chiave primaria non può avere valori NULL.

Una tabella può avere una sola chiave primaria, che può essere costituita da uno o più campi. Quando più campi vengono utilizzati come chiave primaria, vengono chiamati acomposite key.

Se una tabella ha una chiave primaria definita su uno o più campi, non è possibile avere due record con lo stesso valore di quel campo.

Esempio

Hai già visto vari esempi sopra in cui abbiamo creato la tabella COMAPNY4 con ID come chiave primaria -

CREATE TABLE COMPANY4(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

Vincolo chiave estera

Un vincolo di chiave esterna specifica che i valori in una colonna (o un gruppo di colonne) devono corrispondere ai valori che appaiono in una riga di un'altra tabella. Diciamo che questo mantiene l'integrità referenziale tra due tabelle correlate. Sono chiamate chiavi esterne perché i vincoli sono esterni; cioè fuori dal tavolo. Le chiavi esterne sono talvolta chiamate chiave di riferimento.

Esempio

Ad esempio, la seguente istruzione PostgreSQL crea una nuova tabella denominata COMPANY5 e aggiunge cinque colonne.

CREATE TABLE COMPANY6(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

Ad esempio, la seguente istruzione PostgreSQL crea una nuova tabella denominata DEPARTMENT1, che aggiunge tre colonne. La colonna EMP_ID è la chiave esterna e fa riferimento al campo ID della tabella COMPANY6.

CREATE TABLE DEPARTMENT1(
   ID INT PRIMARY KEY      NOT NULL,
   DEPT           CHAR(50) NOT NULL,
   EMP_ID         INT      references COMPANY6(ID)
);

CONTROLLA vincolo

Il vincolo CHECK consente a una condizione di verificare il valore immesso in un record. Se la condizione restituisce false, il record viola il vincolo e non viene inserito nella tabella.

Esempio

Ad esempio, la seguente istruzione PostgreSQL crea una nuova tabella denominata COMPANY5 e aggiunge cinque colonne. Qui, aggiungiamo una colonna CONTROLLO con SALARIO, in modo che tu non possa avere alcun SALARIO come Zero.

CREATE TABLE COMPANY5(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL    CHECK(SALARY > 0)
);

Vincolo di ESCLUSIONE

I vincoli di esclusione assicurano che se due righe vengono confrontate sulle colonne o espressioni specificate utilizzando gli operatori specificati, almeno uno di questi confronti di operatori restituirà false o null.

Esempio

Ad esempio, la seguente istruzione PostgreSQL crea una nuova tabella denominata COMPANY7 e aggiunge cinque colonne. Qui, aggiungiamo un vincolo EXCLUDE -

CREATE TABLE COMPANY7(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT,
   AGE            INT  ,
   ADDRESS        CHAR(50),
   SALARY         REAL,
   EXCLUDE USING gist
   (NAME WITH =,
   AGE WITH <>)
);

Qui, USING gist è il tipo di indice da creare e utilizzare per l'applicazione.

È necessario eseguire il comando CREATE EXTENSION btree_gist , una volta per database. Questo installerà l'estensione btree_gist, che definisce i vincoli di esclusione sui tipi di dati scalari semplici.

Dato che abbiamo imposto che l'età deve essere la stessa, vediamo questo inserendo i record nella tabella -

INSERT INTO COMPANY7 VALUES(1, 'Paul', 32, 'California', 20000.00 );
INSERT INTO COMPANY7 VALUES(2, 'Paul', 32, 'Texas', 20000.00 );
INSERT INTO COMPANY7 VALUES(3, 'Paul', 42, 'California', 20000.00 );

Per le prime due istruzioni INSERT, i record vengono aggiunti alla tabella COMPANY7. Per la terza istruzione INSERT, viene visualizzato il seguente errore:

ERROR:  conflicting key value violates exclusion constraint "company7_name_age_excl"
DETAIL:  Key (name, age)=(Paul, 42) conflicts with existing key (name, age)=(Paul, 32).

Eliminazione dei vincoli

Per rimuovere un vincolo è necessario conoscerne il nome. Se il nome è noto, è facile lasciarlo cadere. Altrimenti, devi scoprire il nome generato dal sistema. Il comando psql \ d nome tabella può essere utile qui. La sintassi generale è:

ALTER TABLE table_name DROP CONSTRAINT some_name;