• Aucun résultat trouvé

Secret (cliquez pour afficher)

Code : SQL

ALTER TABLE Animal

ADD CONSTRAINT fk_espece_id FOREIGN KEY (espece_id) REFERENCES Espece(id);

Pour tester l'efficacité de la clé étrangère, essayons d'ajouter un animal dont l'espece_id est 5 (qui n'existe donc pas dans la table Espece) :

Code : SQL

INSERT INTO Animal (nom, espece_id, date_naissance) VALUES ('Caouette', 5, '2009-02-15 12:45:00');

Code : Console

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`elevage`.`animal`, CONSTRAINT `fk_espece_id` FOREIGN KEY (`espece_id`) REFERENCES `espece` (`id`))

Elle est pas belle la vie ?

J'en profite également pour ajouter une contrainte NOT NULL sur la colonne espece_id . Après tout, si espece ne pouvait pas être NULL, pas de raison qu'espece_id puisse l'être ! Ajoutons également l'index UNIQUE sur (nom, espece_id ) dont on a déjà discuté.

Secret (cliquez pour afficher)

Code : SQL

ALTER TABLE Animal

MODIFY espece_id SMALLINT UNSIGNED NOT NULL; CREATE UNIQUE INDEX ind_uni_nom_espece_id ON Animal (nom, espece_id);

Notez qu'il n'était pas possible de mettre la contrainte NOT NULL à la création de la colonne, puisque tant que l'on n'avait pas rempli espece_id , elle contenait NULL pour toutes les lignes.

Voilà, nos deux tables sont maintenant prêtes. Mais avant de vous lâcher dans l'univers merveilleux des jointures et des sous- requêtes, nous allons encore compliquer un peu les choses. Parce que c'est bien joli pour un éleveur de pouvoir reconnaître un chien d'un chat, mais il serait de bon ton de reconnaître également un berger allemand d'un teckel, non ?

Par conséquent, nous allons encore ajouter deux choses à notre base. D'une part, nous allons ajouter une table Race, basée sur le même schéma que la table Espece. Il faudra également ajouter une colonne à la table Animal, qui contiendra l'id de la race de l'animal. Contrairement à la colonne espece_id , celle-ci pourra être NULL. Il n'est pas impossible que nous accueillions des bâtards, ou que certaines espèces que nous élevons ne soient pas classées en plusieurs races différentes.

Ensuite, nous allons garder une trace du pedigree de nos animaux. Pour ce faire, il faut pouvoir connaître ses parents. Donc, nous ajouterons deux colonnes à la table Animal : pere_id et mere_id , qui contiendront respectivement l'id du père et l'id de la mère de l'animal.

Ce sont toutes des commandes que vous connaissez, donc je ne détaille pas plus.

-- --- -- CREATION DE LA TABLE Race -- ---

CREATE TABLE Race (

id SMALLINT UNSIGNED AUTO_INCREMENT, nom VARCHAR(40) NOT NULL,

espece_id SMALLINT UNSIGNED NOT NULL, -- pas de nom latin, mais une référence vers l'espèce

description TEXT, PRIMARY KEY(id),

CONSTRAINT fk_race_espece_id FOREIGN KEY (espece_id) REFERENCES Espece(id) -- pour assurer l'intégrité de la référence

)

ENGINE = InnoDB;

-- --- -- REMPLISSAGE DE LA TABLE -- ---

INSERT INTO Race (nom, espece_id, description)

VALUES ('Berger allemand', 1, 'Chien sportif et élégant au pelage dense, noir-marron-fauve, noir ou gris.'),

('Berger blanc suisse', 1, 'Petit chien au corps compact, avec des pattes courtes mais bien proportionnées et au pelage tricolore ou bicolore.'),

('Boxer', 1, 'Chien de taille moyenne, au poil ras de couleur fauve ou bringé avec quelques marques blanches.'),

('Bleu russe', 2, 'Chat aux yeux verts et à la robe épaisse et argentée.'),

('Maine coon', 2, 'Chat de grande taille, à poils mi-longs.'), ('Singapura', 2, 'Chat de petite taille aux grands yeux en amandes.'),

('Sphynx', 2, 'Chat sans poils.');

-- --- -- AJOUT DE LA COLONNE race_id A LA TABLE Animal -- ---

ALTER TABLE Animal

ADD COLUMN race_id SMALLINT UNSIGNED; ALTER TABLE Animal

ADD CONSTRAINT fk_race_id FOREIGN KEY (race_id) REFERENCES Race(id);

-- --- -- REMPLISSAGE DE LA COLONNE -- ---

UPDATE Animal SET race_id = 1 WHERE id IN (1, 13, 20, 18, 22, 25,

26, 28);

UPDATE Animal SET race_id = 2 WHERE id IN (12, 14, 19, 7); UPDATE Animal SET race_id = 3 WHERE id IN (23, 17, 21, 27);

UPDATE Animal SET race_id = 4 WHERE id IN (33, 35, 37, 41, 44, 31,

3);

UPDATE Animal SET race_id = 5 WHERE id IN (43, 40, 30, 32, 42, 34,

39, 8);

UPDATE Animal SET race_id = 6 WHERE id IN (29, 36, 38);

-- --- -- AJOUT DES COLONNES mere_id ET pere_id A LA TABLE Animal -- ---

ALTER TABLE Animal

ADD COLUMN mere_id SMALLINT UNSIGNED; ALTER TABLE Animal

ADD CONSTRAINT fk_mere_id FOREIGN KEY (mere_id) REFERENCES Animal(id); ALTER TABLE Animal

ADD COLUMN pere_id SMALLINT UNSIGNED; ALTER TABLE Animal

ADD CONSTRAINT fk_pere_id FOREIGN KEY (pere_id) REFERENCES Animal(id);

-- --- -- REMPLISSAGE DES COLONNES mere_id ET pere_id -- ---

UPDATE Animal SET mere_id = 18, pere_id = 22 WHERE id = 1; UPDATE Animal SET mere_id = 7, pere_id = 21 WHERE id = 10; UPDATE Animal SET mere_id = 41, pere_id = 31 WHERE id = 3; UPDATE Animal SET mere_id = 40, pere_id = 30 WHERE id = 2;

A priori, la seule chose qui pourrait vous avoir surpris dans ces requêtes ce sont les clés étrangères sur mere_id et pere_id qui référencent toutes deux une autre colonne de la même table.

Bien, maintenant que nous avons trois tables et des données sympathiques à exploiter, nous allons passer aux choses sérieuses avec les jointures d'abord, puis les sous-requêtes.

En résumé

Une clé primaire permet d'identifier chaque ligne de la table de manière unique : c'est à la fois une contrainte d'unicité et une contrainte NOT NULL.

Chaque table doit définir une clé primaire, et une table ne peut avoir qu'une seule clé primaire.

Jointures

Vous vous attaquez maintenant au plus important chapitre de cette partie. Le principe des jointures est plutôt simple à comprendre (quoiqu'on puisse faire des requêtes très compliquées avec), et totalement indispensable.

Les jointures vont vous permettre de jongler avec plusieurs tables dans la même requête.

Pour commencer, nous verrons le principe général des jointures. Puis, nous ferons un petit détour par les alias, qui servent beaucoup dans les jointures (mais pas seulement). Ensuite, retour sur le sujet avec les deux types de jointures : internes et

externes. Et pour finir, après un rapide tour d'horizon des syntaxes possibles pour faire une jointure, je vous propose quelques

exercices pour mettre tout ça en pratique.

Documents relatifs