Dans Postgresql, force unique sur combinaison de deux colonnes

192

Je voudrais mettre en place une table dans PostgreSQL de telle sorte que deux colonnes ensemble doivent être uniques. Il peut y avoir plusieurs valeurs de l'une ou l'autre valeur, tant qu'il n'y en a pas deux qui partagent les deux.

Par exemple:

CREATE TABLE someTable (
    id int PRIMARY KEY AUTOINCREMENT,
    col1 int NOT NULL,
    col2 int NOT NULL
)

Donc, col1et col2peut répéter, mais pas en même temps. Donc, cela serait autorisé (sans compter l'identifiant)

1 1
1 2
2 1
2 2

mais pas ça:

1 1
1 2
1 1 -- would reject this insert for violating constraints
PearsonArtPhoto
la source
Comme il s'agit d'un résultat de recherche de premier rang sur Google, il est peut-être préférable de fournir également une table alter exist
ϻαϻɾΣɀО-MaMrEzO

Réponses:

228
CREATE TABLE someTable (
    id serial primary key,
    col1 int NOT NULL,
    col2 int NOT NULL,
    unique (col1, col2)
)

autoincrementn'est pas postgresql. Vous voulez un serial.

Si col1 et col2 font un unique et ne peuvent pas être null alors ils font une bonne clé primaire:

CREATE TABLE someTable (
    col1 int NOT NULL,
    col2 int NOT NULL,
    primary key (col1, col2)
)
Clodoaldo Neto
la source
6
J'aime la suggestion d'une clé primaire unique ici, car nous n'autorisons pas les valeurs NULL dans ce cas. Des PostgeSQL docs: « Notez qu'une contrainte unique ne constitue pas en soi, fournir un identifiant unique , car il n'exclut pas les valeurs NULL). » Postgresql.org/docs/8.1/static/ddl-constraints.html#AEN2038
ndequeker
Comment puis-je implémenter cela dans la définition de schéma?
wagng
2
Dans certains scénarios, vous souhaiterez peut-être qu'une clé de substitution soit utilisée comme clé primaire plutôt que comme une combinaison de colonnes. En particulier pour améliorer les performances lors de la réalisation de jointures sur de gros volumes de données. J'ai personnellement opté pour la solution UNIQUE CONSTRAINT ci-dessous.
Alexis.Rolland
1
Est-il possible d'appliquer une contrainte unique sur une seule permutation, telle que unique (col1, col2 = '1')?
Vikram Khemlani
160

Créez une contrainte unique selon laquelle deux nombres ensemble NE PEUVENT PAS être répétés ensemble:

ALTER TABLE someTable
ADD UNIQUE (col1, col2)
djangojazz
la source
18

Semble comme une contrainte UNIQUE régulière :)

CREATE TABLE example (
a integer,
b integer,
c integer,
UNIQUE (a, c));

Plus ici

Timur Sadykov
la source
1
Cela ajoute-t-il un index pour aet un index pour cindépendamment? Parce que j'ai besoin de trouver rapidement basé sur aparfois, et de trouver rapidement basé sur cparfois.
CMCDragonkai