Sur la partie 7 du cours, au moment d'entrer le fichier .csv, je ne trouve pas le moyen de le faire car j'ai la réponse :
mysql> LOAD DATA LOCAL INFILE 'animal.csv'
-> INTO TABLE Animal
-> FIELDS TERMINATED BY ';' ENCLOSED BY '"'
-> LINES TERMINATED BY '\n' -- ou '\r\n' selon l'ordinateur et le programme utilisés pour créer le fichier
-> (espece, sexe, date_naissance, nom, commentaires);
ERROR 1148 (42000): The used command is not allowed with this MySQL version
et suite à plusieurs tentatives et recherches sur internet, j'ai tenté un :
MySQL -p -u root --enable-local-infile
de sorte que j'ai alors la configuration suivante :
mysql> SHOW VARIABLES LIKE 'local_infile';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile | ON |
+---------------+-------+
1 row in set (0.01 sec)
(précédemment, c'était à OFF : j'ai compris qu'avant la version 8 par défaut c'était à ON, ensuite par souci de sécurité l'installation le pose sur OFF. Et la version que j'ai téléchargée est la version 8.0...)
et lorsque je quit et que je reviens sous la session student, le message revient.
J'ai tenté d'ôter le terme LOCAL dans la commande comme suggéré dans un post, voici ce qu'il se produit :
mysql> LOAD DATA INFILE 'animal.csv'
-> INTO TABLE Animal
-> FIELDS TERMINATED BY ';' ENCLOSED BY '"'
-> LINES TERMINATED BY '\n' -- ou '\r\n' selon l'ordinateur et le programme utilisés pour créer le fichier
-> (espece, sexe, date_naissance, nom, commentaires);
ERROR 1045 (28000): Access denied for user 'student'@'localhost' (using password: YES)
Je ne comprends pas car j'ai vérifié et refait la manip de début de cours sous la session root :
GRANT ALL PRIVILEGES ON elevage.* TO 'student'@'localhost';
et une fois revenu sous la session student, j'ai bien sélectionné :
USE elevage;
Bonjour pour répondre à ton message
il faut que tu modifies le fichier my.ini dans le C:\ProgramData\MySQL\MySQL Server 8.0, il faut que tu affiches les dossiers cachés.
une fois dans le fichier "my" ouvre le avec notepad++ et cherche la ligne
# Secure File Priv. secure-file-priv="C:/ProgramData/MySQL/MySQL Server 8.0/Uploads"
soit tu mets tes fichiers dans ce dossier soit tu mets un '#' devant la ligne secure-file-priv="C:/ProgramData/MySQL/MySQL Server 8.0/Uploads" pour la grisé et choisir d'ouvrir un fichier qui peut être ailleurs sur ton pc.
LOAD DATA INFILE 'C://ProgramData/MySQL/MySQL Server 8.0/Uploads/animal.csv' INTO TABLE animal FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n' (id,espece,sexe,date_naissance,nom,commentaires);
choisi de mettre les slash dans le bon sens / et non comme ça \ et de retirer le Local dans la première ligne.
Merci McDevKing07 !
Et désolé pour le temps mis à répondre, j'ai été "out" ces derniers jours.
J'ai trouvé le fichier my.ini, j'ai ajouté # devant la ligne en question puis enregistré (avec le NotePad++).
De fait, j'ajoute au cas où le fichier animal.csv dans ce même répertoire caché et, de retour sur la session student, je tape :
LOAD DATA INFILE 'C://ProgramData/MySQL/MySQL Server 8.0/Uploads/animal.csv'
-> INTO TABLE animal
-> FIELDS TERMINATED BY ';'
-> LINES TERMINATED BY '\r\n'
-> (id,espece,sexe,date_naissance,nom,commentaires);
et j'obtiens le message :
ERROR 1045 (28000): Access denied for user 'student'@'localhost' (using password: YES)
Du coup j'ai tenté un autre chemin (j'ai laissé le # dans le fichier my.ini) : j'ai copié le fichier pour le mettre sur mon répertoire de travail sur lequel le fichier remplissageAnimal.sql à intégrer avait marché précédemment, et reprendre la requête :
mysql> LOAD DATA INFILE 'C:/"Program Files"/MySQL/cours_MySQL/animal.csv'
INTO TABLE animal
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\r\n'
(id,espece,sexe,date_naissance,nom,commentaires);
et j'obtiens encore le même message :
ERROR 1045 (28000): Access denied for user 'student'@'localhost' (using password: YES)
(j'ai la même réponse en écrivant le chemin sans les guillemets autour de Program Files, je tentais le coup de deux façons)
Et dernier essai, sur le bureau :
mysql> LOAD DATA INFILE 'C:/Users/Aurelien Moyen/Desktop/animal.csv'
-> INTO TABLE animal
-> FIELDS TERMINATED BY ';'
-> LINES TERMINATED BY '\r\n'
-> (id,espece,sexe,date_naissance,nom,commentaires);
ERROR 1045 (28000): Access denied for user 'student'@'localhost' (using password: YES)
A ce stade, je ne comprends pas...Auriez-vous une piste complémentaire ?
Merci et à bientôt
Aurélien
- Edité par AurélienMoyen 6 février 2019 à 8:57:32
J'ai fini l'installation de MySQL sur mon PC, et j'ai lancé l'invite de commande et inséré le chemin d'accès au dossier "bin".
Mais quand je tape la syntaxe pour me connecter: <mysql -u root -p > ; Je reçois comme message d'erreur < 'mysql' n'est pas reconnu en tant que commande interne ou externe, un programme exécutable ou un fichier>.
Je précise que je suis sous Windows 8 et utilise msql server 8.0
Je joint une capture d'écran de l'invite de commande.
Avant de résoudre ce souci j'avais aussi désinstallé et reinstallé MySQLinstaller pour repartir sur de bonne base par défauts si ça peut t'aider.
Merci McDevKing07, ça a fonctionné pour la session root (nota pour les suivants : j'ai un peu adapté à la sauce du cours avec le ENCLOSED BY '"' qui manquait).
Pour la session student non par contre, j'ai toujours ce souci de droit d'accès, et j'ai repris ce que tu proposes en adaptant le TO 'student'@'%' en TO 'student'@'localhost' (j'ai fait les deux possibilités).
Du coup, en ce qui me concerne je continuerai sous la session root. Merci en tout cas pour ton aide jusque là !
Si jamais tu avais une piste pour la session student, je resterai attentif pour revenir en arrière et le tester.
Es-tu sûr que MySQLServer a été installé dans le répertoire que tu as indiqué dans le path ? Ou est-ce que tu as seulement recopié la commande SET PATH depuis le cours en adaptant le numéro de version ?
dans le cours il est écrit : "conventions de nommage : mes clés étrangères ont des noms commençant par fk (pour FOREIGN KEY), suivi du nom de la colonne dans la table, puis (si elle s'appelle différemment) du nom de la colonne de référence, le tout séparé par des _ (fk_client_numero, par exemple)."
donc si j'ai mes tables
create table Animal (
id smallint(6) UNSIGNED NOT NULL AUTO_INCREMENT,
sexe char(1) DEFAULT NULL,
date_naissance datetime NOT NULL,
nom varchar(30) DEFAULT NULL,
commentaires text,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8;
create table Espece (
id SMALLINT UNSIGNED AUTO_INCREMENT,
nom_courant VARCHAR(40) NOT NULL,
nom_latin VARCHAR(40) NOT NULL UNIQUE,
description TEXT,
PRIMARY KEY(id)
) ENGINE=InnoDB;
et que je souhaite ajouter la clé étrangère espece_id dans Animal qui fait référence à id dans Espece
la règle de nommage serait la suivante : fk_espece_id_id ? (de votre côté vous avez mis fk_espece_id)
Attention, ce sont des conventions de nommage propres à Taguan ... ce n'est pas une règle absolue et universelle ...
Dans cet exemple et avec les règles de Taguan, il faudrait rajouter une colonne espece_id dans la table Animal, et la contrainte de clé étrangère s'appellerait tout simplement fk_espece_id car ce nom se suffit à lui même pour identifier que l'on parle d'une clé étrangère vers la table espece et sa colonne id ... ici pas vraiment d'ambiguïté ...
@Benzouye
>
Merci pour cette explication, j'ai pris "si elle s'appelle différemment" trop au pied de la lettre, car pour moi, espece_id (de la table ANIMAL) est différent de id (de la table ESPECE).
Dans tous les cas, si c'est règle de nommage n'est pas universelle, je suppose que le plus important c'est que le nom soit explicite.
Je ne parviens pas à mettre en oeuvre la cde 'LOAD DATA LOCAL INFILE.... ' pour des raisons manifestes de sécurité (ERROR 1148the used command is not allowed ).
Je ne suis pas parvenu à configurer MySQL pour dépasser ce problème en consultant la documentation. Il y a semble-t-il une option à rajouter dans la ligne de cde, côté client (--local-infile elevage) mais aussi un fichier de configuration à modifier côté serveur (je en suis pas parvenu à la faire en ligne, même comme root).
Bref, je patauge, ... et j'aurais vivement apprécié un complément sur ce point dans le cours....
Sur la partie 7 du cours, au moment d'entrer le fichier .csv, je ne trouve pas le moyen de le faire car j'ai la réponse :
mysql> LOAD DATA LOCAL INFILE 'animal.csv'
-> INTO TABLE Animal
-> FIELDS TERMINATED BY ';' ENCLOSED BY '"'
-> LINES TERMINATED BY '\n' -- ou '\r\n' selon l'ordinateur et le programme utilisés pour créer le fichier
-> (espece, sexe, date_naissance, nom, commentaires);
ERROR 1148 (42000): The used command is not allowed with this MySQL version
et suite à plusieurs tentatives et recherches sur internet, j'ai tenté un :
MySQL -p -u root --enable-local-infile
de sorte que j'ai alors la configuration suivante :
mysql> SHOW VARIABLES LIKE 'local_infile';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile | ON |
+---------------+-------+
1 row in set (0.01 sec)
(précédemment, c'était à OFF : j'ai compris qu'avant la version 8 par défaut c'était à ON, ensuite par souci de sécurité l'installation le pose sur OFF. Et la version que j'ai téléchargée est la version 8.0...)
et lorsque je quit et que je reviens sous la session student, le message revient.
J'ai tenté d'ôter le terme LOCAL dans la commande comme suggéré dans un post, voici ce qu'il se produit :
mysql> LOAD DATA INFILE 'animal.csv'
-> INTO TABLE Animal
-> FIELDS TERMINATED BY ';' ENCLOSED BY '"'
-> LINES TERMINATED BY '\n' -- ou '\r\n' selon l'ordinateur et le programme utilisés pour créer le fichier
-> (espece, sexe, date_naissance, nom, commentaires);
ERROR 1045 (28000): Access denied for user 'student'@'localhost' (using password: YES)
Je ne comprends pas car j'ai vérifié et refait la manip de début de cours sous la session root :
GRANT ALL PRIVILEGES ON elevage.* TO 'student'@'localhost';
et une fois revenu sous la session student, j'ai bien sélectionné :
USE elevage;
Bonjour pour répondre à ton message
il faut que tu modifies le fichier my.ini dans le C:\ProgramData\MySQL\MySQL Server 8.0, il faut que tu affiches les dossiers cachés.
une fois dans le fichier "my" ouvre le avec notepad++ et cherche la ligne
# Secure File Priv. secure-file-priv="C:/ProgramData/MySQL/MySQL Server 8.0/Uploads"
soit tu mets tes fichiers dans ce dossier soit tu mets un '#' devant la ligne secure-file-priv="C:/ProgramData/MySQL/MySQL Server 8.0/Uploads" pour la grisé et choisir d'ouvrir un fichier qui peut être ailleurs sur ton pc.
LOAD DATA INFILE 'C://ProgramData/MySQL/MySQL Server 8.0/Uploads/animal.csv' INTO TABLE animal FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n' (id,espece,sexe,date_naissance,nom,commentaires);
choisi de mettre les slash dans le bon sens / et non comme ça \ et de retirer le Local dans la première ligne.
Merci McDevKing07 !
Et désolé pour le temps mis à répondre, j'ai été "out" ces derniers jours.
J'ai trouvé le fichier my.ini, j'ai ajouté # devant la ligne en question puis enregistré (avec le NotePad++).
De fait, j'ajoute au cas où le fichier animal.csv dans ce même répertoire caché et, de retour sur la session student, je tape :
LOAD DATA INFILE 'C://ProgramData/MySQL/MySQL Server 8.0/Uploads/animal.csv'
-> INTO TABLE animal
-> FIELDS TERMINATED BY ';'
-> LINES TERMINATED BY '\r\n'
-> (id,espece,sexe,date_naissance,nom,commentaires);
et j'obtiens le message :
ERROR 1045 (28000): Access denied for user 'student'@'localhost' (using password: YES)
Du coup j'ai tenté un autre chemin (j'ai laissé le # dans le fichier my.ini) : j'ai copié le fichier pour le mettre sur mon répertoire de travail sur lequel le fichier remplissageAnimal.sql à intégrer avait marché précédemment, et reprendre la requête :
mysql> LOAD DATA INFILE 'C:/"Program Files"/MySQL/cours_MySQL/animal.csv'
INTO TABLE animal
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\r\n'
(id,espece,sexe,date_naissance,nom,commentaires);
et j'obtiens encore le même message :
ERROR 1045 (28000): Access denied for user 'student'@'localhost' (using password: YES)
(j'ai la même réponse en écrivant le chemin sans les guillemets autour de Program Files, je tentais le coup de deux façons)
Et dernier essai, sur le bureau :
mysql> LOAD DATA INFILE 'C:/Users/Aurelien Moyen/Desktop/animal.csv'
-> INTO TABLE animal
-> FIELDS TERMINATED BY ';'
-> LINES TERMINATED BY '\r\n'
-> (id,espece,sexe,date_naissance,nom,commentaires);
ERROR 1045 (28000): Access denied for user 'student'@'localhost' (using password: YES)
A ce stade, je ne comprends pas...Auriez-vous une piste complémentaire ?
Merci et à bientôt
Aurélien
- Edité par AurélienMoyen 6 février 2019 à 8:57:32
Problème de sécurisation de MySQL qui n'autorise pas de charger un fichier. Avec l'utilisateur root mets la variable local_infile à 1 avec un :
SET GLOBAL local_infile = 1;
SET PERSIST local_infile = 1;
En principe ça devrait fonctionner sinon tu dois mettre ton fichier dans le répertoire spécifié par la commande
je suis à la partie "insérer des données" du cours sur MySQL et lorsque je veux insérer des lignes dans ma table Animal, une erreur m'est retournée car MySQL ne reconnait pas les accents (or, il y en a dans la colonne commentaire). Pourtant je suis bien en encodage "utf8mb4" et collation "utf8mb4_unicode_ci"... Donc je ne comprends vraiment pas le problème :/ Si quelqu'un a la solution ça serait fort sympa de m'aider Merci !
Merci pour ta réponse ! Donc je ne suis qu'au tout début du cours et je suis au moment où la base de données a été créée, la table Animal aussi et je dois donc introduire des données dans cette table. Donc j'effectue la requête : INSERT INTO Animal (espece, sexe, date_naissance, nom, commentaires) VALUES ('chien', 'F', '2008-12-06 05:18:00', 'caroline', 'Née aveugle') ;
Et MySQL me renvoie cette erreur : ERROR 1366 (HY000) : Incorrect string value : '\x8 ave...' for column 'commentaires' at row 1.
Donc je comprends bien qu'il n'arrive pas à lire l'accent de "Née aveugle" mais pourtant je suis bien en utf-8...
Ta base de données et la colonne en question sont encodées en UTF-8, en revanche, ce que tu tapes dans la console ne l'est pas ... par défaut c'est un encodage OEMCP (ou OEM 850).
Je ne connais pas de solution simple à ce problème ... Je te conseillerai de continuer en enlevant les accents et caractères spéciaux de tes requêtes. A peine plus loin dans le cours tu verras les commandes LOAD DATA et SOURCE qui te permettront de travailler à partir de fichier texte, et non plus directement dans la console, et comme tu maîtrises facilement l'encodage d'un fichier texte, tu n'auras plus de problème avec cela.
Tu as raison c'est bien la console qui était en encodage latin1 ( = 850) donc je l'ai simplement changé en tapant dans l'invite de commande "chcp 65001" qui change l'encodage en utf-8 et le problème a été résolu ! après je sais pas si ça résout le problème complètement (car ça paraît assez simple comme solution) mais au moins ça fonctionne Et oui avec un fichier texte, je suppose que ça ne sera plus un soucis. Merci pour ton aide en tout cas !
Je ne t'ai pas proposé cette solution (chcp) car même si cela fonctionne, les caractères accentués ne s'affichent pas dans la console et c'est trompeur, on a l'impression qu'ils ne sont pas présents alors que si ... mais c'est vrai que cela fonctionne
Ah d'accord, merci pour cette clarification ! Par contre j'ai un autre petit soucis (c'est plus une perte de temps qu'un réel soucis), mon terminal n'enregistre pas les modifications donc par exemple, à chaque fois que j'ouvre mon terminal, je dois changer l'encodage de mon terminal en utf-8 car il se remet à chaque fois en latin1. Pareil pour le chemin vers mon fichier bin de mysql, je dois à chaque fois ajouter le chemin aux dossier explorés par l'invite de commande via la commande : "set PATH=%PATH%;chemin_vers_fichier_sql_bin" sinon il ne reconnait pas la commande mysql...
Personnellement, je crée un fichier .bat avec les commandes à exécuter systématiquement (dans ton cas chcp et SET PATH) et je passe par ce fichier chaque fois que besoin ...
Sinon, il faudrait jouer sur les clés de registre, et je n'aime pas trop faire cela ...
Ah d'accord, merci pour cette clarification ! Par contre j'ai un autre petit soucis (c'est plus une perte de temps qu'un réel soucis), mon terminal n'enregistre pas les modifications donc par exemple, à chaque fois que j'ouvre mon terminal, je dois changer l'encodage de mon terminal en utf-8 car il se remet à chaque fois en latin1. Pareil pour le chemin vers mon fichier bin de mysql, je dois à chaque fois ajouter le chemin aux dossier explorés par l'invite de commande via la commande : "set PATH=%PATH%;chemin_vers_fichier_sql_bin" sinon il ne reconnait pas la commande mysql...
Bonjour,
Sous windows pour changer ton PATH
- ouvre le panneau Système avec la combinaison des touches Windows+Pause.
- va dans Paramètes système avancés.
- dans le panneau Propriétés système clique sur Variables d'environnement.
- clique en haut dans les variables utilisateur sur nouvelle
- met en nom de la variable : MYSQL
- met en valeur ton chemin et valide
- sélectionne dans ta fenêtre variables utilisateur la variable Path et clique sur modifier.
- clique sur nouveau pour ajouter à la suite %MYSQL% et valide tout avec OK.
Ah oui bonne idée ! comme ça il n'y a plus qu'à l’exécuter une seule fois et le tour est joué Merci pour tous les conseils ! Merci aussi pour l'explication je vais suivre les étapes. J'utilise le terminal de windows (cmd) pour interagir avec MySQL et envoyer les requêtes
- Edité par GeoffreyRemacle 14 mars 2019 à 12:58:30
j'ai du mal à comprendre la raison du "OR Animal.id IS NULL"; l'id étant une clé primaire, il ne sera jamais NULL.
Ou alors c'est la façon dont MySQL effectue ses différentes opérations qui peut donner un NULL sur l'id et dans ce cas, j'aimerais bien un détail de ce que MySQL a comme données à chaque opération et dans quel ordre il effectue ces opérations. (j'ai mis les tables, quelques inserts et la requête plus bas)
/*Requete*/
SELECT Espece.nom_latin, COUNT(espece_id) AS nombre
FROM Espece
LEFT JOIN Animal ON Animal.espece_id = Espece.id
WHERE sexe = 'M' OR Animal.id IS NULL
GROUP BY Espece.nom_latin
HAVING nombre < 5;
Merci d'avance pour vos réponses.
PS: les tables Espece et Race sont au complet, je n'ai mis que 3 Animaux qui sont, je pense, suffisants pour une éventuelle explication de mon problème.
Libre à vous d'en rajouter si vous estimez que c'est nécessaire à l'explication.
/*Tables*/
CREATE TABLE Animal (
id smallint(6) unsigned NOT NULL AUTO_INCREMENT,
sexe char(1) DEFAULT NULL,
date_naissance datetime NOT NULL,
nom varchar(30) DEFAULT NULL,
commentaires text,
espece_id smallint(6) unsigned NOT NULL,
race_id smallint(6) unsigned DEFAULT NULL,
mere_id smallint(6) unsigned DEFAULT NULL,
pere_id smallint(6) unsigned DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY ind_uni_nom_espece_id (nom,espece_id)
) ENGINE=InnoDB AUTO_INCREMENT=65 DEFAULT CHARSET=utf8;
CREATE TABLE Espece (
id smallint(6) unsigned NOT NULL AUTO_INCREMENT,
nom_courant varchar(40) NOT NULL,
nom_latin varchar(40) NOT NULL,
description text,
PRIMARY KEY (id),
UNIQUE KEY nom_latin (nom_latin)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;
CREATE TABLE Race (
id smallint(6) unsigned NOT NULL AUTO_INCREMENT,
nom varchar(40) NOT NULL,
espece_id smallint(6) unsigned NOT NULL,
description text,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;
/*Cles etrangeres*/
ALTER TABLE Animal ADD CONSTRAINT fk_espece_id FOREIGN KEY (espece_id) REFERENCES Espece (id);
ALTER TABLE Animal ADD CONSTRAINT fk_race_id FOREIGN KEY (race_id) REFERENCES Race (id) ON DELETE SET NULL;
/*Insertions*/
LOCK TABLES Animal WRITE;
INSERT INTO Animal VALUES (1,'M','2010-04-05 13:43:00','Rox','Mordille beaucoup',1,1,18,22),
(2,NULL,'2010-03-24 02:23:00','Roucky',NULL,2,NULL,40,30),(3,'F','2010-09-13 15:02:00','Schtroumpfette',NULL,2,4,41,31);
UNLOCK TABLES;
LOCK TABLES Race WRITE;
INSERT INTO Race VALUES (1,'Berger allemand',1,'Chien sportif et élégant au pelage dense, noir-marron-fauve, noir ou gris.'),(2,'Berger blanc suisse',1,'Petit chien au corps compact, avec des pattes courtes mais bien proportionnées et au pelage tricolore ou bicolore.'),
(3,'Singapura',2,'Chat de petite taille aux grands yeux en amandes.'),(4,'Bleu russe',2,'Chat aux yeux verts et à la robe épaisse et argentée.'),(5,'Maine coon',2,'Chat de grande taille, à poils mi-longs.'),
(7,'Sphynx',2,'Chat sans poils.'),(8,'Nebelung',2,'Chat bleu russe, mais avec des poils longs...');
UNLOCK TABLES;
LOCK TABLES Espece WRITE;
INSERT INTO Espece VALUES (1,'Chien','Canis canis','Bestiole à quatre pattes qui aime les caresses et tire souvent la langue'),(2,'Chat','Felis silvestris','Bestiole à quatre pattes qui saute très haut et grimpe aux arbres'),(3,'Tortue d''Hermann','Testudo hermanni','Bestiole avec une carapace très dure'),
(4,'Perroquet amazone','Alipiopsitta xanthops','Joli oiseau parleur vert et jaune');
UNLOCK TABLES;
Pour poursuivre sur mon problème, je sais que le LEFT JOIN me permet de garder l'intégralité de la table Espece, ensuite l'on a la jointure Animal.espece_id = Espece.id.
La table de droite étant Animal, s'il n'y a pas d'ANIMAL.espece_id qui soit référencé dans ESPECE.id, le SQL va mettre NULL, or la structure de ma table empêche une valeur nulle sur ce champ (espece_id smallint(6) unsigned NOT NULL).
Et j'ai ma contrainte d'intégrité sur ma clé étrangère qui empêche toute valeur non référencée:
Alors peut-être que c'est une mauvaise conception de la base, ou peut-être que je n'ai toujours pas compris le fonctionnement et donc je ne vois toujours pas pourquoi ce OR ANIMAL.id IS NULL.
Si une espèce n'a pas d'animal elle ressortira quand même ce qui ne serait pas le cas avec une jointure interne ou une jointure externe droite (RIGHT JOIN) ...
A new life is starting!
A new life is starting!
A new life is starting!
A new life is starting!