Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Cours] Administrez vos BDD avec MySQL

5 février 2019 à 10:16:30

McDevKing07 a écrit:

AurélienMoyen a écrit:

Bonjour à tous,

Je précise que je travaille sur Windows.

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

  • Partager sur Facebook
  • Partager sur Twitter
6 février 2019 à 13:46:15

Salut AurélienMoyen il faut que tu check dans tes utilisateurs, il faut pas que t'en ai plusieurs.

Je l'ai testé avec le Root donc je n'ai pas eu affaire à cette erreur. Dis moi si avec le Root ça marche

Tu as bien mis le FLUSH PRIVILEGES aprés avoir donné le ALLPRIVILEGES ?

Essaye

GRANT ALL PRIVILEGES ON elevage.* TO 'student'@'127.0.0.1';
GRANT ALL PRIVILEGES ON elevage.* TO 'student'@'%';
FLUSH PRIVILEGES;

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.

  • Partager sur Facebook
  • Partager sur Twitter
8 février 2019 à 1:59:48

Bonjour,

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.


Que dois-je faire?
  • Partager sur Facebook
  • Partager sur Twitter
8 février 2019 à 6:35:33

Benzouye a écrit:

Essaye :

mysql> grant super on *.* to 'pat'@'localhost';

Puis :

mysql> flush privileges;
Merci, ça marche !



  • Partager sur Facebook
  • Partager sur Twitter
11 février 2019 à 9:07:16

McDevKing07 a écrit:

Salut AurélienMoyen il faut que tu check dans tes utilisateurs, il faut pas que t'en ai plusieurs.

Je l'ai testé avec le Root donc je n'ai pas eu affaire à cette erreur. Dis moi si avec le Root ça marche

Tu as bien mis le FLUSH PRIVILEGES aprés avoir donné le ALLPRIVILEGES ?

Essaye

GRANT ALL PRIVILEGES ON elevage.* TO 'student'@'127.0.0.1';
GRANT ALL PRIVILEGES ON elevage.* TO 'student'@'%';
FLUSH PRIVILEGES;

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.

Excellente journée !

  • Partager sur Facebook
  • Partager sur Twitter
15 février 2019 à 17:06:30

@kasperskool

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 ?

  • Partager sur Facebook
  • Partager sur Twitter
18 février 2019 à 15:26:45

@Zachee54

Merci pour ta réponses en effet l'erreur était a ce niveau. 

J'ai pu corriger cela

  • Partager sur Facebook
  • Partager sur Twitter
22 février 2019 à 17:04:54

Bonjour, bonsoir,

je rencontre un problème de compréhension avec la convention de nommage des clés étrangères au niveau du cours : https://openclassrooms.com/fr/courses/1959476-administrez-vos-bases-de-donnees-avec-mysql/1963057-cles-primaires-et-etrangeres

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)

Cordialement, Hortiks.

  • Partager sur Facebook
  • Partager sur Twitter
- Hortiks.
24 février 2019 à 13:56:11

Bonjour,

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é ...

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
24 février 2019 à 18:13:25

@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.

-
Edité par Hortiks 24 février 2019 à 18:14:03

  • Partager sur Facebook
  • Partager sur Twitter
- Hortiks.
6 mars 2019 à 21:38:48

Bonjour,

J'ai installé MySQL 8.O.

J'en suis à la leçon 7 (Insérer des données)

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....

Merci d'avance!

  • Partager sur Facebook
  • Partager sur Twitter
8 mars 2019 à 10:24:39

AurélienMoyen a écrit:

McDevKing07 a écrit:

AurélienMoyen a écrit:

Bonjour à tous,

Je précise que je travaille sur Windows.

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 

SHOW VARIABLES LIKE 'secure_file_priv';

Si ça peut aider quelqu'un



-
Edité par 이도 (Yi Do) 12 mars 2019 à 16:07:10

  • Partager sur Facebook
  • Partager sur Twitter

A new life is starting!

8 mars 2019 à 10:54:02

L'erreur te dit que l'utilisateur MySQL "student" n'est pas autorisé à exécuter cette commande ... Rien à voir avec le fichier au la commande SQL ...

Il faut t'assurer que l'utilisateur "student" dispose des accès nécessaire pour travailler sur la base en question ...

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
8 mars 2019 à 23:15:06

Le privilège FILE est un privilège global. Tu ne peux pas le demander sur une base seulement.

Il faut écrire :

GRANT FILE PRIVILEGE ON *.* TO 'student'@'localhost'



-
Edité par Zachee54 8 mars 2019 à 23:34:02

  • Partager sur Facebook
  • Partager sur Twitter
12 mars 2019 à 15:59:50

@AurélienMoyen

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 

SHOW VARIABLES LIKE 'secure_file_priv';

Si ça peut aider quelqu'un



-
Edité par 이도 (Yi Do) 12 mars 2019 à 16:07:31

  • Partager sur Facebook
  • Partager sur Twitter

A new life is starting!

13 mars 2019 à 16:21:11

Bonjour, 

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 :D Merci ! 

  • Partager sur Facebook
  • Partager sur Twitter
13 mars 2019 à 17:08:23

Bonjour,

Quelle requête exécutes-tu exactement ? Et quelle erreur obtiens-tu exactement ?

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
13 mars 2019 à 19:26:11

Bonjour, 

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... 

  • Partager sur Facebook
  • Partager sur Twitter
14 mars 2019 à 9:52:19

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.

-
Edité par Benzouye 14 mars 2019 à 9:52:34

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
14 mars 2019 à 10:31:54

Bonjour , 

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 :D Et oui avec un fichier texte, je suppose que ça ne sera plus un soucis. Merci pour ton aide en tout cas !  

  • Partager sur Facebook
  • Partager sur Twitter
14 mars 2019 à 10:43:05

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 ;)

Bonne continuation.

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
14 mars 2019 à 10:45:16

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...
  • Partager sur Facebook
  • Partager sur Twitter
14 mars 2019 à 10:51:40

Là encore pas de solution miracle :p

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 ...

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
14 mars 2019 à 11:49:54

GeoffreyRemacle a écrit:

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.

Quelle console utilise tu pour tes requêtes?



  • Partager sur Facebook
  • Partager sur Twitter

A new life is starting!

14 mars 2019 à 12:55:37

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

  • Partager sur Facebook
  • Partager sur Twitter
18 mars 2019 à 5:52:51

Bonjour, concernant cet exercice : https://openclassrooms.com/fr/courses/1959476-administrez-vos-bases-de-donnees-avec-mysql/1967867-exercices-sur-les-agregats#/id/r-1985472

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 &lt; 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;
  • Partager sur Facebook
  • Partager sur Twitter
- Hortiks.
18 mars 2019 à 9:01:55

Bonjour,

Il faut que tu revois le fonctionnement des jointures externes (ici LEFT JOIN) et te comprendras alors l'intérêt du IS NULL ;)

https://openclassrooms.com/fr/courses/1959476-administrez-vos-bases-de-donnees-avec-mysql/1963612-jointures#/id/r-1963508

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
18 mars 2019 à 20:01:23

Bonjour @Hortiks,

Comme le dit @Benzouye c'est une particularité des OUTER JOIN.

Fais un essai en supprimant le OR Animal.id IS NULL.

Quand tu fait un INNER JOIN tu gardes que les lignes communes entre les deux tables.

ici dans le LEFT JOIN tu garde les lignes de la table à gauche donc cellees de la table "Espece". 

Si une espèce n'est pas représentée dans la table "Animal" elle aura NULL en retour à la place de Animal.id

(et non  Animal.id=NULL)

Le fait de rajouter OR Animal.id IS NULL permet d'afficher aussi les lignes de "Espece" qui n'ont pas d'animaux dans la table "Animal".

J'espère que ça t'aidera car moi yen a mieux comprendre maintenant.

  • Partager sur Facebook
  • Partager sur Twitter

A new life is starting!

19 mars 2019 à 0:31:58

Tout d'abord, merci pour vos réponses.

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:

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

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.

-
Edité par Hortiks 19 mars 2019 à 0:35:00

  • Partager sur Facebook
  • Partager sur Twitter
- Hortiks.
19 mars 2019 à 8:25:24

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) ...

Tout va bien dans la conception ;)

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL