Bonsoir Rastaa_html,
Envoyé par
Rastaa_html
Je n'arrive pas à avoir et Clé étrangère->Création de clé étrangère et Index->Filtre d'index->Clé étrangère cochés en même temps. L'une décoche forcément l'autre.
Si la case Index->Filtre d'index->Clé étrangère est cochée, les contraintes ne sont pas générées au niveau SQL.
Pour que les contraintes référentielles (clés étrangères) soient générées, il est impératif que la 1re condition soit remplie :
Clé étrangère est à cocher :
Et pour que les index dédiés aux clés étrangères soient déclarés (CREATE INDEX), il est impératif que la 2e condition soit remplie elle aussi : « Index » coché ainsi que « Filtre sur clé étrangère » .
Maintenant, vos index sont-ils correctement déclarés, à l’instar de l’index EMPLOYE_SERVICE_FK_X ci-dessous ?
Envoyé par
Rastaa_html
Je n'ai toujours pas compris comment ajouter de manière simple la contrainte unique à un champ sans forcément l'indexer ?
Je suppose que vous avez défini une contrainte unique symbolisée par le mickey <ak>, à l’image de la contrainte EMPLOYE_AK (cf. MPD ci-dessus). Vous pouvez sélectionner l’index EMPLOYE_AK_X associé et le supprimer à l’aide de la touche de fonction « Suppr », mais les conséquences sont imprévisibles car, d’une manière générale, les SGBD garantissent l’unicité des clés non pas par du code, mais par l’affectation sous le capot d’un index de type UNIQUE, y a pas le choix (fainéantise oblige). On voit très bien cela en examinant le contenu du catalogue relationnel du SGBD.
Exemple avec PostgreSQL :
SET SCHEMA 'public' ;
CREATE TABLE SERVICE
(
serviceNo INT NOT NULL,
serviceNom VARCHAR(24) NOT NULL,
serviceBudget INT NOT NULL,
CONSTRAINT SERVICE_PK PRIMARY KEY (serviceNo)
) ;
CREATE TABLE EMPLOYE
(
employeNo INT NOT NULL,
serviceNo INT NOT NULL,
employeNom VARCHAR(24) NOT NULL,
employeSalaire INT NOT NULL,
CONSTRAINT EMPLOYE_PK PRIMARY KEY (employeNo),
CONSTRAINT EMPLOYE_AK UNIQUE (employeNom),
CONSTRAINT EMPLOYE_SERVICE_FK FOREIGN KEY (serviceNo)
REFERENCES SERVICE
) ;
CREATE TABLE COURRIEL
(
courrielNo INT NOT NULL,
employeNo INT NOT NULL,
courrielDate DATE NOT NULL,
courrielTexte VARCHAR(64) NOT NULL,
CONSTRAINT COURRIEL_PK PRIMARY KEY (courrielNo),
CONSTRAINT COURRIEL_EMPLOYE_FK FOREIGN KEY (employeNo)
REFERENCES EMPLOYE
) ;
CREATE INDEX COURRIEL_EMPLOYE_FK on COURRIEL (employeNo ASC) ;
CREATE INDEX EMPLOYE_SERVICE_FK_X on EMPLOYE (serviceNo ASC) ;
Contenu du catalogue :
SELECT tablename, indexname
FROM pg_indexes where schemaname = 'public' and tablename in ('service', 'employe', 'courriel')
ORDER BY tablename
;
=>
tablename indexname
--------- --------------------
courriel courriel_pk
courriel courriel_employe_fk
employe employe_pk
employe employe_ak
employe employe_service_fk_x
service service_pk
Si on tente la suppression de l’index EMPLOYE_AK :
Alors c’est macache oualou, plus une astuce débile de la part de PostgreSQL :
Envoyé par
PostgreSQL
ERREUR: n'a pas pu supprimer index employe_ak car il est requis par contrainte employe_ak sur table employe.
État SQL :2BP01
Astuce : Vous pouvez supprimer contrainte employe_ak sur table employe à la place.
Partager