English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

PostgreSQL 约束

Le restrizioni PostgreSQL servono a specificare le regole dei dati nella tabella.

Se esistono comportamenti di dati che violano le restrizioni, il comportamento viene interrotto dalla restrizione.

Le restrizioni possono essere specificate al momento della creazione della tabella (attraverso la dichiarazione CREATE TABLE) o dopo la creazione della tabella (attraverso la dichiarazione ALTER TABLE).

Le restrizioni garantiscono l'accuratezza e la affidabilità dei dati nel database.

Le restrizioni possono essere a livello di colonna o a livello di tabella. Le restrizioni a livello di colonna si applicano solo alle colonne, mentre le restrizioni a livello di tabella si applicano a tutta la tabella.

Ecco alcune delle restrizioni più comuni utilizzate in PostgreSQL.

  • NOT NULLIndica che una colonna non può memorizzare valori NULL.

  • UNIQUEAssicura che i valori di una colonna siano unici.

  • PRIMARY Key: combinazione di NOT NULL e UNIQUE. Assicura che una colonna (o una combinazione di due o più colonne) abbia un identificatore unico, il che aiuta a trovare più facilmente e rapidamente un record specifico nella tabella.

  • FOREIGN Key: garantisce l'integrità referenziale dei valori tra una tabella e un'altra tabella.

  • CHECK: garantisce che i valori nella colonna soddisfino le condizioni specificate.

  • ESCLUSIONE: vincolo esclusivo, garantisce che se si confrontano due righe specifiche di una colonna o un'espressione utilizzando un operatore specifico, almeno uno dei confronti restituirà false o un valore vuoto.

Vincolo NOT NULL

Per impostazione predefinita, una colonna può salvare valori NULL. Se non si desidera che una colonna abbia valori NULL, è necessario definire questo vincolo sulla colonna, specificando che non sono ammessi valori NULL in questa colonna.

NULL è diverso da non avere dati, rappresenta dati sconosciuti.

示例

Di seguito è riportato un esempio di creazione di una nuova tabella denominata COMPANY1, che aggiunge 5 campi, tra cui tre ID, NAME, AGE che non accettano NULL:

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

Vincolo UNIQUE

Il vincolo UNIQUE può impostare una colonna come unica, evitando che si verifichino valori duplicati nella stessa colonna.

示例

Di seguito è riportato un esempio di creazione di una nuova tabella denominata COMPANY3, che aggiunge 5 campi, tra cui AGE impostato come UNIQUE, quindi non è possibile aggiungere 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

La chiave primaria è molto importante durante la progettazione del database.

PRIMARY KEY è chiamata chiave primaria e rappresenta l'identificatore unico di ogni record nella tabella.

È possibile impostare UNIQUE su più colonne, ma una tabella può avere solo una colonna con PRIMARY KEY.

Possiamo utilizzare la chiave primaria per riferirci alle righe della tabella, o impostare la chiave primaria come foreign key in un'altra tabella per creare relazioni tra le tabelle.

La chiave primaria è una combinazione di vincoli non nulli e unici.

Una tabella può avere solo una chiave primaria, che può essere composta da un singolo campo o da più campi. Quando più campi sono utilizzati come chiave primaria, si parla di chiave composta.

Se una tabella definisce una chiave primaria su un campo, non possono esserci due record con lo stesso valore su questi campi.

示例

下面我们创建 COMAPNY4 表,其中 ID 作为主键:

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

FOREIGN KEY 约束

FOREIGN KEY 即外键约束,指定列(或一组列)中的值必须匹配另一个表的某一行中出现的值。

通常一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键),即维护了两个相关表之间的引用完整性。

示例

下面示例创建了一张 COMPANY6 表,并添加了 5 个字段:

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

下面示例创建了一张 DEPARTMENT1 表,并添加了 3 个字段,EMP_ID 就是外键,参照 COMPANY6 的 ID:

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

CHECK 约束

CHECK 约束保证列中的所有值满足某一条件,即对输入一条记录要进行检查。如果条件值为 false,则记录违反了约束,且不能输入到表。

示例

例如,下面示例建了一个新的表 COMPANY5,增加了五列。在这里,我们为 SALARY 列添加了 CHECK,所以工资不能为零:

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)
);

EXCLUSION 约束

EXCLUSION 约束确保如果使用指定的运算符在指定列或表达式上比较任意两行,至少其中一个运算符比较将返回 false 或 null。

示例

下面示例创建了一张 COMPANY7 表,添加了 5 个字段,并且使用了 EXCLUDE 约束。

CREATE TABLE COMPANY7
   ID INT PRIMARY KEY     NOT NULL
   NAME           TEXT
   AGE            INT  ,
   ADDRESS        CHAR(50),
   SALARY         REAL,
   EXCLUDE USING gist
   (NAME WITH =, -- Se NAME è uguale, ma AGE diverso non è permesso l'inserimento, altrimenti è permesso l'inserimento
   AGE WITH <> -- Se il risultato della comparazione è true per l'intera espressione del tavolo, non è permesso l'inserimento, altrimenti è permesso
);

Qui, USING gist è un tipo di index per costruire ed eseguire.

Devi eseguire una volta per ogni database il comando CREATE EXTENSION btree_gist, che installerà l'estensione btree_gist, che definisce le restrizioni EXCLUDE per i tipi di dati scalari puri.

Poiché abbiamo forzatamente eseguito che l'età deve essere la stessa,mostriamo questo inserendo record nella tabella:

INSERT INTO COMPANY7 VALUES(1, 'Paul', 32, 'California', 20000.00);
INSERT INTO COMPANY7 VALUES(2, 'Paul', 32, 'Texas', 20000.00);  
-- Questo dato ha lo stesso NAME del primo e lo stesso AGE del primo, quindi soddisfa le condizioni di inserimento
INSERT INTO COMPANY7 VALUES(3, 'Allen', 42, 'California', 20000.00);
-- Questo dato ha lo stesso NAME degli altri, ma l'AGE è diverso, quindi non è permesso l'inserimento

Le prime due righe sono state aggiunte con successo alla tabella COMPANY7, ma la terza genererà un errore:

ERROR: Valore duplicato chiave viola la restrizione unica "company7_pkey"
DETAIL: Chiave (id)=(3) già esistente.

Elimina restrizione

Per eliminare una restrizione è necessario conoscere il nome della restrizione, se già conosciuto, è semplice eliminare la restrizione; se non si conosce il nome, è necessario trovare il nome generato dal sistema, utilizzando \d tabella_name per trovare queste informazioni.

La sintassi generale è la seguente:

ALTER TABLE table_name DROP CONSTRAINT some_name;