Bonjour à tous,
Dans le cadre de la découverte du SQL et mysql j’ai fait une petite base dont le thème pratique est une bibliothèque de livre au sein d’un CE. Ce dernier permet à ses employés d’emprunter des livres. Pour savoir qui emprunte quoi au sein de la bibli j’ai fait une petit étude des besoins et un MLD en fonction de règles arbitraires que j’ai fixé.
Pour m’aider après le balayage des donnés j’ai fait le MLD sous windev ,mais pb ce dernier gommant les difficultés certaines choses reste floue quand je dois les réaliser à la mano sous mySQL et tout particulièrement pour les tables associatives :
sous mysql j’ai créé les tables principales + une liaison simple nommée appartenir entre les tables editeur (1,n)← appartenir →(1,1) livre (j’utilise le code 04.sql) . dans la table livre (coté 1,1) j’ai créé une colonne IDediteur de type identique à celle contenue dans la table editeur et j’ai importé la clef étrangére qui apparaît avec le suffixe MUL :
si j’essaye de supprimer la table editeur j’obtiens un magnifique :”ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constrain fails” ce qui tend à prouver que les tables sont liés par une relation .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 /*mysql> describe livre; +----------------+----------------------+------+-----+---------+---------------- + | Field | Type | Null | Key | Default | Extra | +----------------+----------------------+------+-----+---------+---------------- + | IDlivre | smallint(5) unsigned | NO | PRI | NULL | auto_increment | | isbn13 | smallint(5) unsigned | NO | | NULL | | | titre | varchar(45) | NO | | NULL | | | langue | char(2) | NO | | fr | | | nb_page | smallint(5) unsigned | NO | | NULL | | | annee_parution | year(4) | NO | | NULL | | | resume | text | YES | | NULL | | | IDediteur | smallint(5) unsigned | NO | MUL | NULL | | +----------------+----------------------+------+-----+---------+---------------- + 8 rows in set (0.01 sec)*/
Mon PB : dans le cadre de la céation d’une table associative nommé livre_contributeur qui fait le lien entre la table livre & contributeur des choses m'échappent et j’espere que vous pourrez m’éclairer :
La relation de ces 3 tables étant :
contributeur(1,N) <--> (1,1)livre_contributeur(1,1)<-->livre(1,N) la cardinalité (1,1) etant sur la table associative c’est là il me semble que je dois importer les clef secondaires du coup j’ai procédé comme suit :
Dans le doute j’ai essayé des variantes :
La 05a.sql
J’ai créé la table livre_contributeur avec idlivre et idcontributeur en PK :
J’importe les clefs PK des tables livre & editeur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 /* on cré la table livre_contributeur entre les tables livre & contributeur*/ CREATE TABLE IF NOT EXISTS livre_contributeur( IDlivre SMALLINT UNSIGNED NOT NULL, IDcontributeur SMALLINT UNSIGNED NOT NULL, PRIMARY KEY (IDlivre,IDcontributeur) ) ENGINE=INNODB; /* On fixe le moteur de base de donné INNODB permet de gerer les clefs etrangéres */ /*mysql> describe livre_contributeur -> ; +----------------+----------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------+----------------------+------+-----+---------+-------+ | IDlivre | smallint(5) unsigned | NO | PRI | NULL | | | IDcontributeur | smallint(5) unsigned | NO | PRI | NULL | | +----------------+----------------------+------+-----+---------+-------+ 2 rows in set (0.07 sec)*/
Si j’essaye d'effacer la table livre_contributeur elle s’efface sans me signaler un pb de clef secondaires → j’en conclue que c’est pas la bonne méthode...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 /*Sur la table livre_contributeur cardianlité (1,1) on importe les clefs etrangeres */ /*contributeur(1,N) --> (1,1)livre_contributeur*/ ALTER TABLE livre_contributeur ADD CONSTRAINT FK_contribuer_1 FOREIGN KEY (IDcontributeur) REFERENCES contributeur(IDcontributeur); /*livre(1,N) --> (1,1)livre_contributeur*/ ALTER TABLE livre_contributeur ADD CONSTRAINT FK_contribuer_2 FOREIGN KEY (IDlivre) REFERENCES livre(IDlivre); /*mysql> describe livre_contributeur; +----------------+----------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------+----------------------+------+-----+---------+-------+ | IDlivre | smallint(5) unsigned | NO | PRI | NULL | | | IDcontributeur | smallint(5) unsigned | NO | PRI | NULL | | +----------------+----------------------+------+-----+---------+-------+ 2 rows in set (0.01 sec)*/
variante 05b.sql :
J’ai créé la table livre_contributeur avec idlivre et idcontributeur sans les déclarer PK :
J’importe les clefs PK des tables livre & editeur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 /* ------------------ CREATION DES TABLES ASSOCIATIVES(s) V05b ------------------ */ /* on cré la table livre_contributeur entre les tables livre & contributeur*/ CREATE TABLE IF NOT EXISTS livre_contributeur( IDlivre SMALLINT UNSIGNED NOT NULL, IDcontributeur SMALLINT UNSIGNED NOT NULL ) ENGINE=INNODB; /* On fixe le moteur de base de donné INNODB permet de gerer les clefs etrangéres */ /*mysql> describe livre_contributeur -> ; +----------------+----------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------+----------------------+------+-----+---------+-------+ | IDlivre | smallint(5) unsigned | NO | | NULL | | | IDcontributeur | smallint(5) unsigned | NO | | NULL | | +----------------+----------------------+------+-----+---------+-------+ 2 rows in set (0.07 sec)*/
Je déclare une PK constitué de IDlivre & IDcontributeur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 /*Sur la table livre_contributeur cardianlité (1,1) on importe les clefs etrangeres */ /*contributeur(1,N) --> (1,1)livre_contributeur*/ ALTER TABLE livre_contributeur ADD CONSTRAINT FK_contribuer_1 FOREIGN KEY (IDcontributeur) REFERENCES contributeur(IDcontributeur); /*livre(1,N) --> (1,1)livre_contributeur*/ ALTER TABLE livre_contributeur ADD CONSTRAINT FK_contribuer_2 FOREIGN KEY (IDlivre) REFERENCES livre(IDlivre); /*mysql> describe livre_contributeur; +----------------+----------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------+----------------------+------+-----+---------+-------+ | IDlivre | smallint(5) unsigned | NO | MUL | NULL | | | IDcontributeur | smallint(5) unsigned | NO | MUL | NULL | | +----------------+----------------------+------+-----+---------+-------+ 2 rows in set (0.02 sec)*/
J’en conclue que c’est sûrement pas la bonne méthode car les clefs MUL sont devenues PRI → j’ai écrasé mon boulot de l'étape 2.... et je peux dropper la table livre_contributeur .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 /*On ajoute une clef primaire sur la table livre_contributeur composé de livre_contributeur.IDlivre & livre_contributeur.IDcontributeur*/ ALTER TABLE livre_contributeur ADD PRIMARY KEY (IDlivre,IDcontributeur); /*mysql> describe livre_contributeur; +----------------+----------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------+----------------------+------+-----+---------+-------+ | IDlivre | smallint(5) unsigned | NO | PRI | NULL | | | IDcontributeur | smallint(5) unsigned | NO | PRI | NULL | | +----------------+----------------------+------+-----+---------+-------+ 2 rows in set (0.01 sec)*/
variante 05c.sql :
J’ai créé la table livre_contributeur avec IDlivre_contributeur, idlivre et idcontributeur sans les déclarer PK :
J’importe les clefs étrangères de IDlivre & IDcontributeur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 /* ------------------ CREATION DES TABLES ASSOCIATIVES(s) V05c ------------------ */ /* on cré la table livre_contributeur entre les tables livre & contributeur*/ CREATE TABLE IF NOT EXISTS livre_contributeur( IDlivre_contributeur SMALLINT UNSIGNED NOT NULL, IDlivre SMALLINT UNSIGNED NOT NULL, IDcontributeur SMALLINT UNSIGNED NOT NULL ) ENGINE=INNODB; /* On fixe le moteur de base de donné INNODB permet de gerer les clefs etrangéres */ /* mysql> describe livre_contributeur; +----------------------+----------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------------+----------------------+------+-----+---------+-------+ | IDlivre_contributeur | smallint(5) unsigned | NO | | NULL | | | IDlivre | smallint(5) unsigned | NO | | NULL | | | IDcontributeur | smallint(5) unsigned | NO | | NULL | | +----------------------+----------------------+------+-----+---------+-------+ 3 rows in set (0.01 sec)
Je créé une cléf primaire composé des 2 clefs secondaires :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 /*Sur la table livre_contributeur cardianlité (1,1) on importe les clefs etrangeres */ /*contributeur(1,N) --> (1,1)livre_contributeur*/ ALTER TABLE livre_contributeur ADD CONSTRAINT FK_contribuer_1 FOREIGN KEY (IDcontributeur) REFERENCES contributeur(IDcontributeur); /*livre(1,N) --> (1,1)livre_contributeur*/ ALTER TABLE livre_contributeur ADD CONSTRAINT FK_contribuer_2 FOREIGN KEY (IDlivre) REFERENCES livre(IDlivre); /*mysql> describe livre_contributeur; +----------------------+----------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------------+----------------------+------+-----+---------+-------+ | IDlivre_contributeur | smallint(5) unsigned | NO | | NULL | | | IDlivre | smallint(5) unsigned | NO | MUL | NULL | | | IDcontributeur | smallint(5) unsigned | NO | MUL | NULL | | +----------------------+----------------------+------+-----+---------+-------+ 3 rows in set (0.01 sec)
Je ne trouve pas d’explication comment faire de IDlivre_contributeur une PK composé de IDlivre + IDcontributeur !!!
in fine je suis loin de mon MLD windev …bien sur windev n’est pas mysql mais pourriez vous me guider vers la bonne piste pour faire une table de liaison composé mes de 2 clef secondaires ?
cordialement sudtek
PS : Ci-joint un lien pour consulter mon dossier complet avec la procédure, détails des tables, le code sql …
https://docs.google.com/document/d/1...hZpT8xUW8/edit
Partager