Bonjour,
Je suis en train de potasser un examen de base de données, et pour me donner du coeur à l'ouvrage, je suis en train d'implémenter la base de données d'exemple du cours sous PostgreSQL.
Mais j'ai un petit souci ;-))
Bon, j'ai un peur de dire encore des bétises, mais bon, comme j'apprends à chaque fois, j'espère que j'en dirai de moins en moins avec le temps !
Voilà, nous avons, entre autres, une table employé et une table département. Dans la table département, nous avons un champ chef qui est une clé étrangère vers la table employé. Et dans la table employé, nous avons un champ qui est département ou l'employé travaille. Ce champ est bien entendu une clé étrangère vers la table département. OK, c'est logique, pas de souci à ce niveau-là. Mais maintenant, dans le script sql, je me retrouve avec :
create table departement (
.
.
.
boss_id_emp integer not null,
.
.
.
foreign key (boss_id_emp) references employes(id_emp)
);
create table employes (
.
.
.
id_dept integer not null,
.
.
.
foreign key (id_dept) references departement
);
Et là, PostgreSQL me dit que la table employes n'existe pas, et donc, qu'il ne peut créer une référence vers cette table.
Alors, comment puis-je faire pour implémenter cette modélisation dans un système ?
En espérant que la question n'est pas trop stupide !!!
# Re: Récurrence en SQL
Posté par Guillaume Smet (site web personnel) . Évalué à 4.
Il suffit que tu :
- crées ta table departement sans la contrainte de clé étrangère
- crées la table employes complète
- modifies ta table departement pour ajouter la clé étrangère
[^] # Re: Récurrence en SQL
Posté par gourgou . Évalué à 1.
[^] # Re: Récurrence en SQL
Posté par saorge . Évalué à 0.
Grave lacune du SQL ;-))
# Re: Récurrence en SQL ???left:3%;
Posté par Jerome Herman . Évalué à 2.
Ne jamais faire de double referencement !
Tu fais comment pour tes triggers le jour ou tu dois changer le nom d'un de tes boss ? Si tu detruis un departement ou que tu le fusionnes avec un autre bonjour les contraintes....
Je ne connais pas le reste de ta base et je ne sais pas comment tu vas faire mais il y a plusieurs solutions :
1) on met tout dans la table employes :
CREATE TABLE public.employes (
id_emp integer NOT NULL,
id_dept integer NOT NULL,
is_the_boss boolean NOT NULL,
foreign key (id_dept) references departement
CONSTRAINT employes_pkey PRIMARY KEY (id_emp),
) WITH OIDS;
La t'es tranquile, tu sais que ca va passer. Il suffit de declarer ta table departement en premier. C'est beau, c'est propre ca brille.
Probleme si il faut qu'un departement ait un boss en permanence et que tu veux le changer tu es oblige de faire "sale" au millieu (en eteigant la contrainte qui verifie que le boss existe ou en mettant deux boss pendant une courte periode de temps).
2) on creer une table de jointure (je suis pas fan, mais des fois c'est pratique)
CREATE TABLE public.who_is_the_boss(
id_theboss integer NOT NULL,
id_dept integer,
id_emp integer,
CONSTRAINT null_or_something CHECK(id_theboss>0 or (foreign key (id_dept) references departement and foreign key (id_emp) references employees))
)WITH OIDS
INSERT INTO public.who_is_the_boss VALUES(0,NULL,NULL)
N.B il faudra probablement rajouter la contrainte apres avoir cree les trois tables. On ne se sert de l'enregistremnt 0 que dans des cas bien precis (creationd de departement pour lequel les employes n'ont pas encore ete crees et vice-versa).
CREATE TABLE public.departement (
id_dept integer NOT NULL,
id_theboss integer NOT NULL,
foreign key (id_theboss) references who_is_the_boss,
CONSTRAINT departement_pkey PRIMARY KEY (id_dept),
) WITH OIDS;
CREATE TABLE public.employes (
id_emp integer NOT NULL,
id_dept integer NOT NULL,
foreign key (id_dept) references departement
CONSTRAINT employes_pkey PRIMARY KEY (id_emp),
) WITH OIDS;
3) On utilise les classes, parcque postgres c'est de l'objet et c'est bien.
CREATE TABLE public.departement (
id_dept integer NOT NULL,
CONSTRAINT departement_pkey PRIMARY KEY (id_dept),
) WITH OIDS;
CREATE TABLE public.employes (
id_emp integer NOT NULL,
id_dept integer NOT NULL,
foreign key (id_dept) references departement
CONSTRAINT employes_pkey PRIMARY KEY (id_emp),
) WITH OIDS;
CREATE TABLE public.boss (
//-infos specifique au boss
)INHERITS (employes);
Creer un boss revient a creer un employe avec ses infos specifiques en plus.
Ensuite select * from boss -> te donne la liste des boss
select * from employes -> te donne la liste des employes et des boss
select * from ONLY employes -> te donne la liste des seuls employes.
Le tout etant a adapter a tes besoins.
Kha
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.