Je débute en SQL en général et PostgreSQL en particulier. Dans une table
contenant des "paires", c'est-à-dire deux colonnes de même type dont
l'ordre est indifférent pour l'application ({a, b} est équivalent à {b,
a}), comment créer une contrainte d'unicité sur ces deux colonnes
empêchant l'insertion de {a, b} si {b, a} existe déjà ?
Je débute en SQL en général et PostgreSQL en particulier. Dans une table
contenant des "paires", c'est-à-dire deux colonnes de même type dont
l'ordre est indifférent pour l'application ({a, b} est équivalent à {b,
a}), comment créer une contrainte d'unicité sur ces deux colonnes
empêchant l'insertion de {a, b} si {b, a} existe déjà ?
Je débute en SQL en général et PostgreSQL en particulier. Dans une table
contenant des "paires", c'est-à-dire deux colonnes de même type dont
l'ordre est indifférent pour l'application ({a, b} est équivalent à {b,
a}), comment créer une contrainte d'unicité sur ces deux colonnes
empêchant l'insertion de {a, b} si {b, a} existe déjà ?
Je débute en SQL en général et PostgreSQL en particulier. Dans une table
contenant des "paires", c'est-à-dire deux colonnes de même type dont
l'ordre est indifférent pour l'application ({a, b} est équivalent à {b,
a}), comment créer une contrainte d'unicité sur ces deux colonnes
empêchant l'insertion de {a, b} si {b, a} existe déjà ?
Ca ne me paraît pas trivial cette histoire :-)
Je pencherais plutôt pour un déclencheur.
Sinon pas très propre, ni très performant probablement :
create table paire (a text, b text);
create unique index idx_paire on paire ( ( CASE WHEN a < b THEN a || '*' || b ELSE b || '*' || a END ) );
Il ne (me) semble pas qu'on puisse avoir la même clause (CASE WHEN ...)
en tant que directement contrainte d'unicité de table.
Je débute en SQL en général et PostgreSQL en particulier. Dans une table
contenant des "paires", c'est-à-dire deux colonnes de même type dont
l'ordre est indifférent pour l'application ({a, b} est équivalent à {b,
a}), comment créer une contrainte d'unicité sur ces deux colonnes
empêchant l'insertion de {a, b} si {b, a} existe déjà ?
Ca ne me paraît pas trivial cette histoire :-)
Je pencherais plutôt pour un déclencheur.
Sinon pas très propre, ni très performant probablement :
create table paire (a text, b text);
create unique index idx_paire on paire ( ( CASE WHEN a < b THEN a || '*' || b ELSE b || '*' || a END ) );
Il ne (me) semble pas qu'on puisse avoir la même clause (CASE WHEN ...)
en tant que directement contrainte d'unicité de table.
Je débute en SQL en général et PostgreSQL en particulier. Dans une table
contenant des "paires", c'est-à-dire deux colonnes de même type dont
l'ordre est indifférent pour l'application ({a, b} est équivalent à {b,
a}), comment créer une contrainte d'unicité sur ces deux colonnes
empêchant l'insertion de {a, b} si {b, a} existe déjà ?
Ca ne me paraît pas trivial cette histoire :-)
Je pencherais plutôt pour un déclencheur.
Sinon pas très propre, ni très performant probablement :
create table paire (a text, b text);
create unique index idx_paire on paire ( ( CASE WHEN a < b THEN a || '*' || b ELSE b || '*' || a END ) );
Il ne (me) semble pas qu'on puisse avoir la même clause (CASE WHEN ...)
en tant que directement contrainte d'unicité de table.
Ca ne me paraît pas trivial cette histoire :-)
Je pencherais plutôt pour un déclencheur.
Hum, comme je l'ai dit je débute et je ne sais même pas ce que c'est,
d'autant plus que ma doc est en anglais. Un trigger ?
Il ne (me) semble pas qu'on puisse avoir la même clause (CASE WHEN
...) en tant que directement contrainte d'unicité de table.
Est-ce que ce genre de vérification serait faisable avec une "subquery"
(sous-requête ?) dans une contrainte de type CHECK ?
Ca ne me paraît pas trivial cette histoire :-)
Je pencherais plutôt pour un déclencheur.
Hum, comme je l'ai dit je débute et je ne sais même pas ce que c'est,
d'autant plus que ma doc est en anglais. Un trigger ?
Il ne (me) semble pas qu'on puisse avoir la même clause (CASE WHEN
...) en tant que directement contrainte d'unicité de table.
Est-ce que ce genre de vérification serait faisable avec une "subquery"
(sous-requête ?) dans une contrainte de type CHECK ?
Ca ne me paraît pas trivial cette histoire :-)
Je pencherais plutôt pour un déclencheur.
Hum, comme je l'ai dit je débute et je ne sais même pas ce que c'est,
d'autant plus que ma doc est en anglais. Un trigger ?
Il ne (me) semble pas qu'on puisse avoir la même clause (CASE WHEN
...) en tant que directement contrainte d'unicité de table.
Est-ce que ce genre de vérification serait faisable avec une "subquery"
(sous-requête ?) dans une contrainte de type CHECK ?
Salut,
Je débute en SQL en général et PostgreSQL en particulier. Dans une table
contenant des "paires", c'est-à-dire deux colonnes de même type dont
l'ordre est indifférent pour l'application ({a, b} est équivalent à {b,
a}), comment créer une contrainte d'unicité sur ces deux colonnes
empêchant l'insertion de {a, b} si {b, a} existe déjà ?
Un exemple pratique si ce n'est pas assez parlant :
(ville1, ville2, distance)
Les colonnes ville1 et ville2 contiennent des noms de villes dont
l'ordre est indifférent. Je souhaite par exemple empêcher ('Toulouse',
'Lyon', xx) non seulement si ('Toulouse', 'Lyon', yy) existe déjà
(facile) mais aussi si ('Lyon', 'Toulouse', yy) existe déjà.
Salut,
Je débute en SQL en général et PostgreSQL en particulier. Dans une table
contenant des "paires", c'est-à-dire deux colonnes de même type dont
l'ordre est indifférent pour l'application ({a, b} est équivalent à {b,
a}), comment créer une contrainte d'unicité sur ces deux colonnes
empêchant l'insertion de {a, b} si {b, a} existe déjà ?
Un exemple pratique si ce n'est pas assez parlant :
(ville1, ville2, distance)
Les colonnes ville1 et ville2 contiennent des noms de villes dont
l'ordre est indifférent. Je souhaite par exemple empêcher ('Toulouse',
'Lyon', xx) non seulement si ('Toulouse', 'Lyon', yy) existe déjà
(facile) mais aussi si ('Lyon', 'Toulouse', yy) existe déjà.
Salut,
Je débute en SQL en général et PostgreSQL en particulier. Dans une table
contenant des "paires", c'est-à-dire deux colonnes de même type dont
l'ordre est indifférent pour l'application ({a, b} est équivalent à {b,
a}), comment créer une contrainte d'unicité sur ces deux colonnes
empêchant l'insertion de {a, b} si {b, a} existe déjà ?
Un exemple pratique si ce n'est pas assez parlant :
(ville1, ville2, distance)
Les colonnes ville1 et ville2 contiennent des noms de villes dont
l'ordre est indifférent. Je souhaite par exemple empêcher ('Toulouse',
'Lyon', xx) non seulement si ('Toulouse', 'Lyon', yy) existe déjà
(facile) mais aussi si ('Lyon', 'Toulouse', yy) existe déjà.
Pascal Hambourg a écrit :Salut,
Je débute en SQL en général et PostgreSQL en particulier. Dans une
table contenant des "paires", c'est-à-dire deux colonnes de même type
dont l'ordre est indifférent pour l'application ({a, b} est équivalent
à {b, a}), comment créer une contrainte d'unicité sur ces deux
colonnes empêchant l'insertion de {a, b} si {b, a} existe déjà ?
Un exemple pratique si ce n'est pas assez parlant :
(ville1, ville2, distance)
Les colonnes ville1 et ville2 contiennent des noms de villes dont
l'ordre est indifférent. Je souhaite par exemple empêcher ('Toulouse',
'Lyon', xx) non seulement si ('Toulouse', 'Lyon', yy) existe déjà
(facile) mais aussi si ('Lyon', 'Toulouse', yy) existe déjà.
C'est votre modèle de données qui est faux.
En effet la ville doit être dans ce cas une entité à part et votre table
des distances doit faire référence à l'id de la ville :
Exemple :
CREATE TABLE T_VILLE_VIL
(VIL_ID INT NOT NULL PRIMARY KEY,
VIL_VILLE VARCHAR(64) NOT NULL UNIQUE)
INSERT INTO T_VILLE_VIL VALUES (1, 'Toulouse')
INSERT INTO T_VILLE_VIL VALUES (2, 'Lyon')
INSERT INTO T_VILLE_VIL VALUES (3, 'Paris')
CREATE TABLE T_DISTANCE_VILLE_DTV
(DTV_ID INT NOT NULL PRIMARY KEY,
VIL_ID1 INT NOT NULL
CONSTRAINT PK_VILID1 FOREIGN KEY
REFERENCES T_VILLE_VIL (VIL_ID),
VIL_ID2 INT NOT NULL
CONSTRAINT PK_VILID2 FOREIGN KEY
REFERENCES T_VILLE_VIL (VIL_ID),
DTV_DISTANCE FLOAT,
CONSTRAINT CK_UNIVIL CHECK (VIL_ID1 < VIL_ID2))
-- insertion toulouse lyon
INSERT INTO T_DISTANCE_VILLE_DTV VALUES (1, 1, 2, 450)
-- insertion lyon toulouse
INSERT INTO T_DISTANCE_VILLE_DTV VALUES (2, 2, 1, 450)
/* Conflit entre l'instruction INSERT et la contrainte TABLE CHECK
'CK_UNIVIL'.
Le conflit est survenu dans la base de données 'DB_DIST',
table 'T_DISTANCE_VILLE_DTV'. */
-- insertion toulouse paris
INSERT INTO T_DISTANCE_VILLE_DTV VALUES (3, 1, 3, 450)
-- insertion paris toulouse
INSERT INTO T_DISTANCE_VILLE_DTV VALUES (4, 3, 1, 450)
/* Conflit entre l'instruction INSERT et la contrainte TABLE CHECK
'CK_UNIVIL'.
Le conflit est survenu dans la base de données 'DB_DIST',
table 'T_DISTANCE_VILLE_DTV'. */
-- insertion lyon paris
INSERT INTO T_DISTANCE_VILLE_DTV VALUES (5, 2, 3, 450)
-- insertion paris lyon
INSERT INTO T_DISTANCE_VILLE_DTV VALUES (6, 3, 2, 450)
/* Conflit entre l'instruction INSERT et la contrainte TABLE CHECK
'CK_UNIVIL'.
Le conflit est survenu dans la base de données 'DB_DIST',
table 'T_DISTANCE_VILLE_DTV'. */
-- essais sur paris paris
INSERT INTO T_DISTANCE_VILLE_DTV VALUES (7, 3, 3, 450)
/* Conflit entre l'instruction INSERT et la contrainte TABLE CHECK
'CK_UNIVIL'.
Le conflit est survenu dans la base de données 'DB_DIST',
table 'T_DISTANCE_VILLE_DTV'. */
CQFD
A +
Pascal Hambourg a écrit :
Salut,
Je débute en SQL en général et PostgreSQL en particulier. Dans une
table contenant des "paires", c'est-à-dire deux colonnes de même type
dont l'ordre est indifférent pour l'application ({a, b} est équivalent
à {b, a}), comment créer une contrainte d'unicité sur ces deux
colonnes empêchant l'insertion de {a, b} si {b, a} existe déjà ?
Un exemple pratique si ce n'est pas assez parlant :
(ville1, ville2, distance)
Les colonnes ville1 et ville2 contiennent des noms de villes dont
l'ordre est indifférent. Je souhaite par exemple empêcher ('Toulouse',
'Lyon', xx) non seulement si ('Toulouse', 'Lyon', yy) existe déjà
(facile) mais aussi si ('Lyon', 'Toulouse', yy) existe déjà.
C'est votre modèle de données qui est faux.
En effet la ville doit être dans ce cas une entité à part et votre table
des distances doit faire référence à l'id de la ville :
Exemple :
CREATE TABLE T_VILLE_VIL
(VIL_ID INT NOT NULL PRIMARY KEY,
VIL_VILLE VARCHAR(64) NOT NULL UNIQUE)
INSERT INTO T_VILLE_VIL VALUES (1, 'Toulouse')
INSERT INTO T_VILLE_VIL VALUES (2, 'Lyon')
INSERT INTO T_VILLE_VIL VALUES (3, 'Paris')
CREATE TABLE T_DISTANCE_VILLE_DTV
(DTV_ID INT NOT NULL PRIMARY KEY,
VIL_ID1 INT NOT NULL
CONSTRAINT PK_VILID1 FOREIGN KEY
REFERENCES T_VILLE_VIL (VIL_ID),
VIL_ID2 INT NOT NULL
CONSTRAINT PK_VILID2 FOREIGN KEY
REFERENCES T_VILLE_VIL (VIL_ID),
DTV_DISTANCE FLOAT,
CONSTRAINT CK_UNIVIL CHECK (VIL_ID1 < VIL_ID2))
-- insertion toulouse lyon
INSERT INTO T_DISTANCE_VILLE_DTV VALUES (1, 1, 2, 450)
-- insertion lyon toulouse
INSERT INTO T_DISTANCE_VILLE_DTV VALUES (2, 2, 1, 450)
/* Conflit entre l'instruction INSERT et la contrainte TABLE CHECK
'CK_UNIVIL'.
Le conflit est survenu dans la base de données 'DB_DIST',
table 'T_DISTANCE_VILLE_DTV'. */
-- insertion toulouse paris
INSERT INTO T_DISTANCE_VILLE_DTV VALUES (3, 1, 3, 450)
-- insertion paris toulouse
INSERT INTO T_DISTANCE_VILLE_DTV VALUES (4, 3, 1, 450)
/* Conflit entre l'instruction INSERT et la contrainte TABLE CHECK
'CK_UNIVIL'.
Le conflit est survenu dans la base de données 'DB_DIST',
table 'T_DISTANCE_VILLE_DTV'. */
-- insertion lyon paris
INSERT INTO T_DISTANCE_VILLE_DTV VALUES (5, 2, 3, 450)
-- insertion paris lyon
INSERT INTO T_DISTANCE_VILLE_DTV VALUES (6, 3, 2, 450)
/* Conflit entre l'instruction INSERT et la contrainte TABLE CHECK
'CK_UNIVIL'.
Le conflit est survenu dans la base de données 'DB_DIST',
table 'T_DISTANCE_VILLE_DTV'. */
-- essais sur paris paris
INSERT INTO T_DISTANCE_VILLE_DTV VALUES (7, 3, 3, 450)
/* Conflit entre l'instruction INSERT et la contrainte TABLE CHECK
'CK_UNIVIL'.
Le conflit est survenu dans la base de données 'DB_DIST',
table 'T_DISTANCE_VILLE_DTV'. */
CQFD
A +
Pascal Hambourg a écrit :Salut,
Je débute en SQL en général et PostgreSQL en particulier. Dans une
table contenant des "paires", c'est-à-dire deux colonnes de même type
dont l'ordre est indifférent pour l'application ({a, b} est équivalent
à {b, a}), comment créer une contrainte d'unicité sur ces deux
colonnes empêchant l'insertion de {a, b} si {b, a} existe déjà ?
Un exemple pratique si ce n'est pas assez parlant :
(ville1, ville2, distance)
Les colonnes ville1 et ville2 contiennent des noms de villes dont
l'ordre est indifférent. Je souhaite par exemple empêcher ('Toulouse',
'Lyon', xx) non seulement si ('Toulouse', 'Lyon', yy) existe déjà
(facile) mais aussi si ('Lyon', 'Toulouse', yy) existe déjà.
C'est votre modèle de données qui est faux.
En effet la ville doit être dans ce cas une entité à part et votre table
des distances doit faire référence à l'id de la ville :
Exemple :
CREATE TABLE T_VILLE_VIL
(VIL_ID INT NOT NULL PRIMARY KEY,
VIL_VILLE VARCHAR(64) NOT NULL UNIQUE)
INSERT INTO T_VILLE_VIL VALUES (1, 'Toulouse')
INSERT INTO T_VILLE_VIL VALUES (2, 'Lyon')
INSERT INTO T_VILLE_VIL VALUES (3, 'Paris')
CREATE TABLE T_DISTANCE_VILLE_DTV
(DTV_ID INT NOT NULL PRIMARY KEY,
VIL_ID1 INT NOT NULL
CONSTRAINT PK_VILID1 FOREIGN KEY
REFERENCES T_VILLE_VIL (VIL_ID),
VIL_ID2 INT NOT NULL
CONSTRAINT PK_VILID2 FOREIGN KEY
REFERENCES T_VILLE_VIL (VIL_ID),
DTV_DISTANCE FLOAT,
CONSTRAINT CK_UNIVIL CHECK (VIL_ID1 < VIL_ID2))
-- insertion toulouse lyon
INSERT INTO T_DISTANCE_VILLE_DTV VALUES (1, 1, 2, 450)
-- insertion lyon toulouse
INSERT INTO T_DISTANCE_VILLE_DTV VALUES (2, 2, 1, 450)
/* Conflit entre l'instruction INSERT et la contrainte TABLE CHECK
'CK_UNIVIL'.
Le conflit est survenu dans la base de données 'DB_DIST',
table 'T_DISTANCE_VILLE_DTV'. */
-- insertion toulouse paris
INSERT INTO T_DISTANCE_VILLE_DTV VALUES (3, 1, 3, 450)
-- insertion paris toulouse
INSERT INTO T_DISTANCE_VILLE_DTV VALUES (4, 3, 1, 450)
/* Conflit entre l'instruction INSERT et la contrainte TABLE CHECK
'CK_UNIVIL'.
Le conflit est survenu dans la base de données 'DB_DIST',
table 'T_DISTANCE_VILLE_DTV'. */
-- insertion lyon paris
INSERT INTO T_DISTANCE_VILLE_DTV VALUES (5, 2, 3, 450)
-- insertion paris lyon
INSERT INTO T_DISTANCE_VILLE_DTV VALUES (6, 3, 2, 450)
/* Conflit entre l'instruction INSERT et la contrainte TABLE CHECK
'CK_UNIVIL'.
Le conflit est survenu dans la base de données 'DB_DIST',
table 'T_DISTANCE_VILLE_DTV'. */
-- essais sur paris paris
INSERT INTO T_DISTANCE_VILLE_DTV VALUES (7, 3, 3, 450)
/* Conflit entre l'instruction INSERT et la contrainte TABLE CHECK
'CK_UNIVIL'.
Le conflit est survenu dans la base de données 'DB_DIST',
table 'T_DISTANCE_VILLE_DTV'. */
CQFD
A +