Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Cours] Administrez vos BDD avec MySQL

14 février 2018 à 11:49:59

Bonjour,

CasteloWoshu a écrit:

est-ce que c'est du tout simplement à la taille de ma console?

Oui ...

Pour résoudre cela simplement, donne un alias à la colonne :

SELECT
    *,
    MATCH(titre, auteur) AGAINST ('Jules Verne Lune') AS pertinence
FROM Livre;
  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
16 février 2018 à 21:12:36

Bon allez, je pensais trouver absolument tout seul, mais j'y ai passé trop d'heures, j'ai l'impression d'en avoir fait le tour et je bloque. Je viens donc solliciter de l'aide. Il s'agit de l'activité "Améliorer la base de données de votre blog" (Activité partie 6) . La première question:

1 Sur la page d’accueil, on affiche le nombre de commentaires de chaque article. On veut éviter de calculer cela à chaque affichage de la page. Il faut donc stocker ce nombre quelque part, et automatiser sa mise à jour afin que l’information soit toujours exacte.

J'ai choisi de procéder à l'aide d'un trigger. Tout d'abord j'ai créé une table 'Article_NbreCommentaires' qui prend 2 colonnes: le numéro de l'article (FK liée à 'Commentaire.article_id') et le nombre de commentaires qui lui est associé.

Une fois que tous les numéros d'articles sont rentrés (chaque nouvel article rentré dans 'Article' verra automatiquement son numéro arriver dans la colonne Article_NbreCommentaires.nbre à l'aide d'un autre trigger dans la table 'Articles') , je veux donc faire un trigger attaché à la table 'Commentaire' :

"Pour toute insertion dans la table commentaire, compter le nombre de commentaires associés à chaque article et modifier le résultat dans la colonne 'Article_NbreCommentaires.nbre'."

Et voici le code que j'ai produit:

DELIMITER |
CREATE TRIGGER after_insert_commentaire AFTER INSERT
ON Commentaire FOR EACH ROW
BEGIN 
UPDATE Article_NbreCommentaires
INNER JOIN Commentaire
    ON Article_NbreCommentaires.article_id = Commentaire.article_id 
    SET nbre =
        (SELECT COUNT(Commentaire.article_id) 
        FROM Commentaire 
        GROUP BY Commentaire.article_id)
   ;           
END |
DELIMITER ;

Or, ceci remplit la table 'Article_NbreCommentaires' pas de la manière désirée. En face de chaque numéro d'article, j'ai le chiffre 1. Donc ça ne compte pas. J'ai essayé plusieurs choses, et sinon ça me compte tous les commentaires de la table et me met le total à chaque ligne. Je ne jette pas l'éponge, mais je souffre depuis quelques heures :D Alors j'appelle à l'aide !

(Après il y aura bien sûr à gérer l'affichage du nombre de commentaires dans la page d'accueil + l'insertion d'une nouvelle ligne dans 'Article_NbreCommentaires' à chaque nouvel article dans 'Article'.

Bref, je ne sais pas si je fais trop compliqué ......

PS: j'espère que c'est clair, sinon demandez-moi svp ! Ce sera sans doute plus clair pour ceux qui ont déjà fait l'activité.

-
Edité par Delgesu 16 février 2018 à 21:28:34

  • Partager sur Facebook
  • Partager sur Twitter
17 février 2018 à 10:21:47

J'avais fait ceci en son temps, à voir si cela peut aider.

DELIMITER # 
CREATE TRIGGER after_insert_commentaires AFTER INSERT
ON Commentaire FOR EACH ROW
BEGIN
    UPDATE Article AS a
    SET a.nbre_commentaires = a.nbre_commentaires+1
    WHERE a.id = NEW.article_id;
END #



  • Partager sur Facebook
  • Partager sur Twitter

Christophe Vallot

17 février 2018 à 18:59:11

D'accord. Tu as donc rajouté une colonne nbre_commentaires à la table Article. Et le NEW est un mot-clé MySQL à côté duquel je suis passé ou c'est toi qui rajoute une table ? Moi pas comprendre. Il y a plusieurs façons de procéder je vois.

  • Partager sur Facebook
  • Partager sur Twitter
19 février 2018 à 10:19:22

Effectivement, j'avais suivi un certain nombre d'étapes :

ALTER TABLE Article ADD nbre_commentaires SMALLINT UNSIGNED NULL DEFAULT '0';  -- valeur par défaut 0 et + de 65000 commentaires possibles devrait suffire !


-- Intégration du nombre de commentaires dans la table Article ( uniquement pour l'initialisation)
-- 	1. Je crée une Vue contenant les id des articles et le nombre de commentaires associés
--  2. Je transfère le contenu de la colonne "V_nombre_de_commentaires" de la Vue vers la colonne "nbre_commentaires" de la table Article

-- étape 1 :

CREATE OR REPLACE VIEW V_Article_id_nbre_commentaires
	AS SELECT a.id AS V_article_id,
		   COUNT(c.article_id) AS V_nombre_de_commentaires
	FROM Article AS a
	LEFT JOIN Commentaire AS c
	ON c.article_id=a.id
	GROUP BY a.id;
	
-- SELECT * FROM V_Article_id_nbre_commentaires; -- pour afficher le résultat de la vue

-- étape 2 : mise à jour de la colonne "nbre_commentaires" de la table Article à partir de la colonne "V_nombre_de_commentaires" de la Vue V_Article_id_nbre_commentaires
		  
UPDATE Article AS a, V_Article_id_nbre_commentaires AS v
	SET a.nbre_commentaires = (SELECT v.V_nombre_de_commentaires
							   FROM V_Article_id_nbre_commentaires AS v
							   WHERE v.V_article_id = a.id);
							   
-- SELECT a.id, a.nbre_commentaires FROM Article AS a; -- pour vérifier le résultat du transfert



  • Partager sur Facebook
  • Partager sur Twitter

Christophe Vallot

22 février 2018 à 18:42:00

Bonjour j'ai voulu tester une commande  : 

 sachant que dans les commentaires j'avais un Rox , je comprends pas ma derniére commande me retourne empty , je pensais qu'elle allez retourner Rox ,  merci bien :)

  • Partager sur Facebook
  • Partager sur Twitter
22 février 2018 à 22:19:03

Bonjour,

_ ne vaut pas x ...

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
22 février 2018 à 22:50:51

mais dans le cours on nous explique "Pour ce genre de recherches, l'opérateurLIKEest très utile, car il permet de faire des recherches en utilisant des "jokers", c'est-à-dire des caractères qui représentent n'importe quel caractère.

Deux jokers existent pour LIKE :

  • '%' : qui représente n'importe quelle chaîne de caractères, quelle que soit sa longueur (y compris une chaîne de longueur 0) ;

  • '_' : qui représente un seul caractère.

Quelques exemples :

  • 'b%'cherchera toutes les chaînes de caractères commençant par'b'('brocoli', 'bouli', 'b').

  • 'b_'cherchera toutes les chaînes de caractères contenant deux lettres dont la première est'b'('ba', 'bf', 'b8')"

du coup j'ai voulu testeren faisant "Ro_" dans le but de chercher toutes les chaînes de caractères contenant trois lettres dont les deux premiéres sont Ro  c'est pas correct ma démarche? 

  • Partager sur Facebook
  • Partager sur Twitter
23 février 2018 à 9:32:23

Oui, mais comme écris dans le cours :

CasteloWoshu a écrit:

Deux jokers existent pour LIKE 

Mais là tu n'utilises pas LIKE mais =

Il faudrait que tu fasses :

SELECT *
FROM Animal
WHERE commentaire LIKE 'Ro_'

-
Edité par Benzouye 23 février 2018 à 9:32:45

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
23 février 2018 à 21:38:53

merci :)

Bonjour en executant les commandes suivante : 

J'ai une erreur :

 ERROR 1138 (22004) Invalid use of NULL value


Je comprends pas bien la signification de cette erreur si quelqu'un peux m'aider merci :)



Une deuxiéme question : 


J'ai voulu créer une table dans une base de données et certainnes colonnes doivent comporter des accents mais j'ai l'erreur suivante 


ERROR 1300 (HYOOO): Invalid utf8 character string: 'Num\x82ro'


Comment puis-je corriger cet erreur merci bien :)




-
Edité par CasteloWoshu 26 février 2018 à 2:24:21

  • Partager sur Facebook
  • Partager sur Twitter
28 février 2018 à 18:13:36

Bonjour,

Je suis dans la partie "transactions" du cours et plus particulièrement la partie "Syntaxe et utilisation".

J'avais commencé les 2 premières expériences sans problèmes puis suite à une mauvaise manip (j'ai supprimé toutes les données de la table animal) je réimporté la base entière (format sql) qui est proposée au début du cours "transactions".

Je reprend mes expériences, la 3ème "validation et annulation" et au moment d'insérer la première requête :

INSERT INTO Animal (nom, espece_id, date_naissance, sexe) 

VALUES ('Baba', 5, '2012-02-13 15:45:00', 'F'); 

MySql m'explique qu'à cause de la clé étrangère sur espece_id, je peux pas modifier les données de ma table ? Je ne comprend plus, tout fonctionnait bien avant, quelqu'un a t-il eu le même problème ?

Merci 

  • Partager sur Facebook
  • Partager sur Twitter
1 mars 2018 à 13:26:43

CasteloWoshu a écrit:

ERROR 1138 (22004) Invalid use of NULL value

Je pense que tu as des valeurs NULL dans la colonne espece_id de la table Animal, et que cela n'est plus autorisé après modification de la colonne ...

Avant de faire la modification, il faut t'assurer que chaque enregistrement Animal a une valeur pour espece_id.

CasteloWoshu a écrit:

ERROR 1300 (HYOOO): Invalid utf8 character string: 'Num\x82ro'

Comment as-tu procédé pour pour créer cette table ? Il semblerait qu'il y ait là un problème d'encodage de caractères dans ta requête de création ...

Maxormarcus a écrit:

MySql m'explique qu'à cause de la clé étrangère sur espece_id, je peux pas modifier les données de ma table ?

Si tu essayes d'insérer dans la table Animal une enregistrement dont l'espece_id n'existe pas dans la table espece, oui MySQL refuse l'insertion ... Assure-toi que l'espece_id 5 existe bien dans la table espece ...
  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
1 mars 2018 à 16:27:30

re Bonjour,

En fait, lorsque j'insert mes données, j'ai des erreurs concernant des éléments dans les colonnes "description" et ce dès qu'un accent se présente en fait. Donc en fait, cela empêche d'insérer les données, mes tables sont vides voilà pourquoi je ne pouvais rien insérer hier.

Cela dit, je ne comprend pas pourquoi j'ai ce problème que je n'avais pas avant, pourtant je spécifie bien SET NAMES utf8; mais rien n'y fait. Je regarde sur internet mais je sèche et perd un temps fou devant un problème, encore une fois surement tout bête.

si vous avez une idée ? merci

  • Partager sur Facebook
  • Partager sur Twitter
2 mars 2018 à 8:49:19

Maxormarcus a écrit:

pourtant je spécifie bien SET NAMES utf8; mais rien n'y fait.

Comment travailles-tu ? En console ? Avec un fichier .SQL et la commande SOURCE ? Avec PHPMyAdmin (ou du genre) ?
  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
2 mars 2018 à 8:50:31

Benzouye a écrit:

CasteloWoshu a écrit:

ERROR 1138 (22004) Invalid use of NULL value

Je pense que tu as des valeurs NULL dans la colonne espece_id de la table Animal, et que cela n'est plus autorisé après modification de la colonne ...

Avant de faire la modification, il faut t'assurer que chaque enregistrement Animal a une valeur pour espece_id.

CasteloWoshu a écrit:

ERROR 1300 (HYOOO): Invalid utf8 character string: 'Num\x82ro'

Comment as-tu procédé pour pour créer cette table ? Il semblerait qu'il y ait là un problème d'encodage de caractères dans ta requête de création ...

Merci j'avais effectivement des valeurs null dans espece_id et j'ai mits set character utf-8 en recommençant la création de la base de données



  • Partager sur Facebook
  • Partager sur Twitter
2 mars 2018 à 9:00:55

Benzouye a écrit:

Maxormarcus a écrit:

pourtant je spécifie bien SET NAMES utf8; mais rien n'y fait.

Comment travailles-tu ? En console ? Avec un fichier .SQL et la commande SOURCE ? Avec PHPMyAdmin (ou du genre) ?

Je bosse sur la console MySQL Client 5.7, pas de PHPMyAdmin, et le fichier que j'importe via SOURCE, c'est en fait le copié collé du rappel de la base de données "elevage" (que l'on trouve au début de chaque chapitre) que j'ai converti en .SQL

Pour simplifier le chemin je l'ai mis à la racine de mon disque donc il s'ouvre mais sort des erreurs que j'ai cité précédemment.



  • Partager sur Facebook
  • Partager sur Twitter
2 mars 2018 à 9:03:20

Maxormarcus a écrit:

le fichier que j'importe via SOURCE, c'est en fait le copié collé du rappel de la base de données "elevage" (que l'on trouve au début de chaque chapitre) que j'ai converti en .SQL

Vérfies alors l'encodage de ce fichier. Avec un éditeur de texte (genre notepad++) assure-toi que l'encodage est bien UTF8.

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
2 mars 2018 à 9:19:49

Benzouye a écrit:

Maxormarcus a écrit:

le fichier que j'importe via SOURCE, c'est en fait le copié collé du rappel de la base de données "elevage" (que l'on trouve au début de chaque chapitre) que j'ai converti en .SQL

Vérfies alors l'encodage de ce fichier. Avec un éditeur de texte (genre notepad++) assure-toi que l'encodage est bien UTF8.

:ange: je ne devrais passer que par notepad++, merci, problème résolu.



  • Partager sur Facebook
  • Partager sur Twitter
7 mars 2018 à 18:41:20

Bonjour j'essae de faire un exercice :

Jointures sur deux tables, ou plus ! 1. La race ET l'espèce Vous devez obtenir la liste des chats et des perroquets amazones, avec leur sexe, leur espèce (nom latin) et leur race s'ils en ont une. Regroupez les chats ensemble, les perroquets ensemble et, au sein de l'espèce, regroupez les races.


J'essaye de faire la requete mais je comprends pas pourquoi avec Like ça ne fonctionne pas cfr l'avant derniére requete , avec IN ça fonctionne bien

Merci bien :)

  • Partager sur Facebook
  • Partager sur Twitter
7 mars 2018 à 19:14:11

Merci d'utiliser les balises de code

Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour celà, il faut utiliser le bouton Image . Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: c;">Votre code ici</pre>.

Merci de modifier votre message en conséquence via le bouton "Modifier" situé sur son coin supérieur droit, sans quoi le sujet sera fermé.

Sinon, concernant ta question, c'est parce que le colonne ne peut être LIKE chat ET LIKE perroquet ... C'est LIKE chat OU LIKE perroquet ...

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
7 mars 2018 à 20:08:32

Merci du conseil ,

En faisant l'activité_2

Voici mon code :

CREATE DATABASE p2p_blog CHARACTER SET utf8;

USE p2p_blog;

CREATE TABLE Article (

    id INT UNSIGNED AUTO_INCREMENT NOT NULL,
	Titre VARCHAR(250) NOT NULL,
	Texte LONGTEXT NOT NULL,
	Résumé MEDIUMTEXT NOT NULL,
	commentaires MEDIUMTEXT NOT NULL, -- On va verifier que chaque commentaires --
    PRIMARY KEY(id)                               	-- est bien liée à un utilisateur même s'il s'enregistre pas -- 	
	
	CONSTRAINT fk_commentaires_id
	
		FOREIGN KEY (commentaires)
		REFERENCES Utilisateur(id)

)
ENGINE=InnoDB;

CREATE TABLE Utilisateur (

    id INT UNSIGNED AUTO_INCREMENT NOT NULL,
	
	pseudo VARCHAR(150) ,
	email VARCHAR(255) ,
	mot_passe TINYTEXT,
	PRIMARY KEY(id)
)
ENGINE=InnoDB;

CREATE TABLE Categorie (
	id INT UNSIGNED AUTO_INCREMENT NOT NULL,
	nom VARCHAR(150) NOT NULL,
	description TEXT NOT NULL,
	PRIMARY KEY(id)
)
ENGINE=InnoDB;

CREATE TABLE Categorie_article (

	categorie_id INT UNSIGNED, 
	article_id INT UNSIGNED,
	PRIMARY KEY (categorie_id, article_id)
	
	CONSTRAINT fk_categorie_id_id  -- En créant cette clé étrangére on s'assure que --
	                             -- les articles appartiennent à au moins une catégorie --
                                 								 
		FOREIGN KEY (categorie_id)
		REFERENCES Categorie(id)
)
ENGINE=InnoDB; 

-- On va maintenant remplir les différentes Tables Avant l'affichage -- 


J'ai les erreurs suivantes :

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near '├®sum
├® MEDIUMTEXT NOT NULL,
        commentaires MEDIUMTEXT NOT NULL,
    PRIMA' at line 6
Query OK, 0 rows affected (0.02 sec)

Query OK, 0 rows affected (0.03 sec)

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'CONST
RAINT fk_categorie_id

                    ' at line 7
mysql>

La premiére erreur : il considére que Résumé  est un mot spécial pourtant j'ai bien mit tout en mot utf8 ??

La seconde erreur je la comprend pas non plus car je pense avoir bien suivit les régles pour faire une clé étrangére .

Merci bien :) 

-
Edité par CasteloWoshu 8 mars 2018 à 6:45:54

  • Partager sur Facebook
  • Partager sur Twitter
8 mars 2018 à 13:34:35

Pour la première erreur, vérifies bien que ton fichier SQL est bien encodé en UTF8 :

Benzouye a écrit:

Avec un éditeur de texte (genre notepad++) assure-toi que l'encodage est bien UTF8.

Pour la seconde erreur, il manque une virgule pour séparé la clé primaire de la contrainte ...
  • 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 2018 à 10:53:34

On dirait que j'ai vraiment un souci avec UTF-8, il ne lever plus d'erreur le fichier est bien encoder en UTF-8 Sur SQL

mysql> DESCRIBE Article;
+--------------+------------------+------+-----+---------+----------------+
| Field        | Type             | Null | Key | Default | Extra          |
+--------------+------------------+------+-----+---------+----------------+
| auteur       | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| Titre        | varchar(250)     | NO   |     | NULL    |                |
| Texte        | longtext         | NO   |     | NULL    |                |
| R├®sum├®     | mediumtext       | NO   |     | NULL    |                |
| commentaires | varchar(250)     | NO   |     | NULL    |                |
+--------------+------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

Pour la colonne Résumé les accents ne passe pas , pourtant j'ai bien mits encodage UTF8(sans BOM) sur NOTEPAD ++ ET j'ai essayé avec BOM et c'est la même chose :( 

-
Edité par CasteloWoshu 13 mars 2018 à 11:03:32

  • Partager sur Facebook
  • Partager sur Twitter
13 mars 2018 à 14:20:14

Bonjour

Déja merci pour ce super cours. J'ai un soucis sur les transactions.

J'ai fait SET AUTOCOMMIT=0; puis les exemple du cours mais lorsque je fait ROLLBACK mes prix ne changent pas est ce normal ?

edit: c'est parcque j'utilise les lignes SQL de phpmyadmin et non la console

Cordialement

-
Edité par Charles34 13 mars 2018 à 14:51:10

  • Partager sur Facebook
  • Partager sur Twitter
13 mars 2018 à 17:27:08

Bonsoir CasteloWoshu,

Il me semble avoir lu dans le cours qu'il valait mieux éviter de mettre des accents pour le nom d'un champ. Un champ "resume" fait tout à fait l'affaire et évite les désagréments tels que tu rencontres. Un petit conseil également pour le nom des champs soit tu mets la première lettre avec une majuscule soit en minuscule (il devraient être écrit tout en minuscule par convention) mais une fois que tu as pris une décision, il faut s'y tenir sur toutes les tables de ta base voire toutes les bases que tu créera à l'avenir: ça pourra éviter bien des problèmes. Tu des champs avec majuscule d'autre sans; imagine si, dans quelques mois, tu dois interroger ta base !!!

SELECT auteur, Titre FROM Article
ou
SELECT Auteur, titre FROM Article
ou
SELECT Auteur, Titre FROM Article

Suivant l'OS employé, ça passe ou ça casse !

A+ et bon courage pour la suite.

-
Edité par Philippe2463 13 mars 2018 à 17:45:53

  • Partager sur Facebook
  • Partager sur Twitter
La chute n'est pas un échec, l'échec c'est de rester là où on est tombé!
13 mars 2018 à 19:03:40

Bonsoir Philippe2463 , merci beaucoup pour les recommandations et Bonne suite à vous aussi!
  • Partager sur Facebook
  • Partager sur Twitter
13 mars 2018 à 20:11:14

Jamais d'accent pour le nom des colonnes ! Sacrilège ! Et même tout en minuscule. A la limite pour la première lettre du nom de la table. A la limite ...
  • Partager sur Facebook
  • Partager sur Twitter
13 mars 2018 à 20:13:12

Delgesu a écrit:

Jamais d'accent pour le nom des colonnes ! Sacrilège ! Et même tout en minuscule. A la limite pour la première lettre du nom de la table. A la limite ...


C'est bien enregistré !!!
  • Partager sur Facebook
  • Partager sur Twitter
28 mars 2018 à 15:58:07

Bonjour,

Dans l'Avant-propos de la 3eme partie "Création d'une base de données", le lien vers la documentation officielle MySQL relative aux mots-clés réservés redirige vers une page Not Found : https://dev.mysql.com/doc/refman/5.5/en/reserved-words.html

Faut-il utiliser cette page : https://dev.mysql.com/doc/refman/5.7/en/keywords.html ?

Merci

  • Partager sur Facebook
  • Partager sur Twitter