Descrizione del problema
Ho una situazione in cui voglio far rispettare che una relazione può essere definita solo una volta e voglio risolverlo a livello di database (Postgres).
La seguente situazione considero non valida, poiché la relazione viene definita due volte.
user_id | friend_id
---------+-----------
1 | 35
35 | 1
Ho provato ad aggiungere CHECK
constraints [1] ma non riesco a trovare una condizione che renderà questa situazione non valida. Non sono sicuro di altri modi per gestirlo, senza iniziare a pensare a caratteristiche molto meno trasparenti (come le procedure).
La struttura attuale della tabella:
Table "public.friends"
Column | Type | Modifiers
-----------+---------+-----------
user_id | integer | not null
friend_id | integer | not null
Indexes:
"friends_pkey" PRIMARY KEY, btree (user_id, friend_id)
Check constraints:
"no_schizophrenia" CHECK (friend_id <> user_id)
Foreign-key constraints:
"friends_id_key" FOREIGN KEY (friend_id) REFERENCES users(id)
"user_id_key" FOREIGN KEY (user_id) REFERENCES users(id)
Situazione desiderata
Dati:
user_id | friend_id
---------+-----------
1 | 35
Domanda:
insert into friends (user_id, friend_id) values (35, 1) \g
Risultato:
ERROR: new row for relation "friends" violates check constraint "duplicate_relation"
DETAIL: Failing row contains (35, 1).
[1] - link