UMBB/FS/DI/23-24 Programmation et administration des bases de données Master 2 (S3)/(Dr Djerbi) TP 1 : Clés étrangères : Enoncé Exécuter les requêtes suivantes afin d’en créer les tables () dans votre base de données (à créer la BD « tp_x_m2_fk » comme suit : CREATE DATABASE `tp_x_m2_FK`;). CREATE TABLE product ( category INT NOT NULL, id INT NOT NULL, price DECIMAL, PRIMARY KEY(category, id) ) ENGINE=INNODB; CREATE TABLE customer ( id INT NOT NULL, PRIMARY KEY (id) ) ENGINE=INNODB; CREATE TABLE product_order ( no INT NOT NULL AUTO_INCREMENT, product_category INT NOT NULL, product_id INT NOT NULL, customer_id INT NOT NULL, PRIMARY KEY(no), INDEX (product_category, product_id), INDEX (customer_id), FOREIGN KEY (product_category, product_id) REFERENCES product(category, id) ON UPDATE CASCADE ON DELETE RESTRICT, FOREIGN KEY (customer_id) REFERENCES customer(id) ) ENGINE=INNODB; DR DJERBI 23-24 1 UMBB/FS/DI/23-24 Programmation et administration des bases de données Master 2 (S3)/(Dr Djerbi) Veuillez remplir ces trois tables comme suit : 1- Veuillez modifier le troisième enregistrement de la table « customer » de la valeur 3 vers la valeur 4, comme suit : UPDATE `tp_x_m2_fk`.`customer` SET `id`='4' WHERE `id`=3; 2- Avez-vous pu le faire ? pourquoi ? 3- Faire la même chose avec le premier enregistrement, et répondre à la même question. 4- Veuillez supprimer le troisième enregistrement de la table « customer », comme suit : DELETE FROM `tp_x_m2_fk`.`customer` WHERE `id`=3; 5- Avez-vous pu le faire ? pourquoi ? 6- Faire la même chose avec le premier enregistrement, et répondre à la même question. 7- Supprimer tous les enregistrements de la table (product_order) ayant customer_id =1 avec la requête suivante : delete from product_order where product_order.customer_id=1; 8- Puis refaire les mêmes question ci-dessus, qu'est-ce passe-t-il? . 9- Fait voir les trois NBs suivantes avant de procéder à la réponse. Refaire ces mêmes questions (avec les mêmes données avant suppression) en changeant les mots clés rouges de la requête de création de la table (product_order) avec les valeurs (NO ACTION), que remarquez-vous ?. DR DJERBI 23-24 2 UMBB/FS/DI/23-24 Programmation et administration des bases de données Master 2 (S3)/(Dr Djerbi) NBs : a. Vous pouvez renommer cette table comme suit : RENAME TABLE `product_order` TO `product_order2`; b. Ou, vous pouvez exécuter les deux requêtes suivantes pour en changer ces CI (CONSTRAINT) : ALTER TABLE `product_order` DROP FOREIGN KEY `product_order_ibfk_2`; ALTER TABLE `product_order` ADD CONSTRAINT `product_order_ibfk_2` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION; c. L’identificateur (`product_order_ibfk_2`) fait référence à la CI de la clé étrangère, pour connaitre les noms de vos CI, il faut exécuter (avant toute modification) la requête suivante : SHOW CREATE TABLE tp_x_m2_fk.`product_order2` Qui vous affichera tout ce qui concerne (tp_x_m2_fk.`product_order2`) y compris ses CI comme suit : votre table CREATE TABLE `product_order2` ( `no` int(11) NOT NULL AUTO_INCREMENT, `product_category` int(11) NOT NULL, `product_id` int(11) NOT NULL, `customer_id` int(11) NOT NULL, PRIMARY KEY (`no`), KEY `product_category` (`product_category`,`product_id`), KEY `customer_id` (`customer_id`), CONSTRAINT `product_order_ibfk_1` FOREIGN KEY (`product_category`, `product_id`) REFERENCES `product` (`category`, `id`) ON UPDATE CASCADE, CONSTRAINT `product_order_ibfk_2` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci 10- Refaire ces mêmes questions (avec les mêmes données avant suppression) en changeant les mots clés rouges de la requête de création de la table (product_order) avec les valeurs (CASCADE, RESTRICT, SET NULL) pour (DELETE et UPDATE), que remarquez-vous ? DR DJERBI 23-24 3