PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment n'autoriser qu'une seule ligne pour un tableau ?

Un UNIQUE la contrainte autorise plusieurs lignes avec NULL valeurs, car deux NULL les valeurs ne sont jamais considérées comme identiques.

Des considérations similaires s'appliquent à CHECK contraintes. Ils permettent à l'expression d'être TRUE ou NULL (mais pas FALSE ). Encore une fois, NULL les valeurs dépassent le contrôle.

Pour exclure cela, la colonne doit être défini NOT NULL . Ou faites-en la PRIMARY KEY puisque les colonnes PK sont définies NOT NULL automatiquement. Détails :

Aussi, utilisez simplement boolean :

CREATE TABLE public.onerow (
   onerow_id bool PRIMARY KEY DEFAULT TRUE
 , data text
 , CONSTRAINT onerow_uni CHECK (onerow_id)
);

Le CHECK la contrainte peut être aussi simple pour un boolean colonne. Seulement TRUE est autorisé.

Vous voudrez peut-être REVOKE (ou non GRANT ) le DELETE et TRUNCATE privilèges de public (et tous les autres rôles) pour empêcher la suppression de la ligne unique. Comme :

REVOKE DELETE, TRUNCATE ON public.onerow FROM public;