Je suis bloqué à la première étape de l'activité 6
je fait une Vue Matérialisé pour gagner en performance:
CREATE TABLE VM_Article_commentaire
ENGINE = InnoDB
SELECT A.id, A.titre, A.resume,
DATE_FORMAT(A.date_publication, '%d/%m/%Y') AS 'date_publication', U.pseudo,
COUNT(Commentaire.id) AS 'nombre_commentaire'
FROM Commentaire
RIGHT JOIN Article AS A ON A.id = Commentaire.article_id
INNER JOIN Utilisateur AS U ON A.auteur_id = U.id
GROUP BY A.id
ORDER BY A.date_publication DESC;
Puis je construit mon TRIGGER:
DELIMITER |
CREATE TRIGGER after_insert_commentaire AFTER INSERT
ON Commentaire FOR EACH ROW
BEGIN
INSERT INTO VM_Article_commentaire (id, nombre_commentaire)
SELECT NEW.id, COUNT(*) FROM Commentaire
WHERE id = NEW.id
ON DUPLICATE KEY UPDATE nombre_commentaire = nombre_commentaire + 1;
END |
DELIMITER ;
Lorsque j'essaie d'inserer un nouveau commentaire Patatra!
Message d'erreur que voila:
INSERT INTO Commentaire (article_id, auteur_id, contenu, date_commentaire)
-> VALUE (1, 4, 'Super nouveau commentaire', NOW());
ERROR 1364 (HY000): Field 'titre' doesn't have a default value
Tu essayes d'insérer un enregistrement dans la table commentaire qui a une colonne titre qui ne peut être NULL et n'a pas de valeur par défaut ... Soit tu autorises la valeur NULL, soit tu donnes une valeur par défaut, soit tu précises une valeur lors de l'insert ...
Dans ton TRIGGER, pour un article dont on poste le premier commentaire tu fais un INSERT dans ta vue matérialisée ... sans le titre ... or le titre ne peut être NULL pour cette table (cf. la ligne 17 de ton dernier code) ...
Selon moi, ta solution de vue matérialisée n'est pas la bonne pour résoudre ce problème car tu dois dupliquer trop d'informations dans ta vue ...
Réfléchis plutôt à une autre possibilité (je ne veux pas te spoiler le cours) ...
Nous sommes deux collaborateurs et nous aimerions travailler en même temps sur MySQL pour créer les bases de données à partir du même serveur (Wampserver), comment faire ?
Je viens par ce petit mot, vous demandez quelques informations. Seul on va plus vite, mais ensemble on va plus loin .
Je suis entrain de travailler, pour un projet " Implementation et Mobilisation d'un systeme d'information et la gestion des patients d'un pays en voie du
developpement. Enfin c'est mon projet de fin d'etude.
J'ai deja fais l'analyse et creer des tables, puis codes mais je suis bloques a la fin pour finaliser et creer l'application.
Besion des idees si quelq'un peut m'apporter des informations manquantes
Je travail les bases de données en entreprise et j'ai donc commencé à suivre ce cours, seulement, je suis sur DB2, et je voulais savoir, sachant que je suis à l'exercice Activité_partie2, si il était possible que je puisse tout de même rendre l'exercice pour une correction, même si du coup certaines requêtes diffèrent sur DB2.
@Belle JoraItoua donne plus de précision quel langage as-tu utilisé, quel type d'application veux-tu ? Du desk, android ou IOS ou tous à la fois
@CharlyLerenard1 si tu suis ce cours tu dois rendre les devoirs correspondants au tuto DB2 ce n'est pas MySQL c'est comme si à la fac on t'enseigne du Java et que sur les TP tu demandes à faire tes codes en C# ou C++ vu qu'ils sont tous des langages objets
L'important ce n'est pas d'être grand mais c'est être à la hauteur
J'en suis au chapitre sur les jointures de tables du cours "administrez vos bdd avec MySQL".
J'effectue une requête sur 2 tables: Animal et Espece et je dois afficher le commentaire (de la table Espece) concernant l'animal 'Cartouche' (de la table Animal). La table Espece contient 4 entrées, correspondant aux 4 especes utilisées dans l'exercice.
Logiquement, vue ma requête, seul le commentaire concernant l'espèce à laquelle appartient l'animal 'Cartouche' devrait s'afficher. Or tous les commentaires (des 4 espèces) s'affichent.
J'ai bien sûr la possibilité d'effacer toutes les tables et de recommencer mais j'aimerais autant savoir d'où peut venir l'erreur et essayer de la résoudre....
J'ai le même problème que cette personne, mais je n'ai pas trouvé la réponse dans le forum...
Est-ce que quelqu'un pourrait m'aider?
Merci!
raphaelaboussou a écrit:
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>.
Que dois-je faire?
Ensuite, faut-il ,à chaque fois, inséré le chemin d'accès au dossier 'bin' avant de taper la commande "mysql..."?
Tu dois aller dans les paramètre de système de ton pc. Tu cherche 'variables d’environnement' et tu modifie le path en y ajoutant le chemin d'accès à la suite de ce qui est existant séparé par un ;
Salut! Je vous fecilite pou votre cours, motre methodologie me plait beaucoup. Merci beaucoup, ce cours m'a beaucoup aidÉ. Mais, je n'arrive toujours pas a bien comprendre la notion d'enregistrement de ma base de donnee. J'aimerais avoir une explication supplementaire la-dessus.
En base de données relationnelle, un enregistrement est un élément d'une table, une ligne. Par exemple, si tu as une table "article" destinée à stocker les articles d'un blog, chaque article stocké dans la table est un enregistrement.
Je ne sais pas si c'est cela que tu entendais par enregistrement ...
Sinon peux-tu mettre un lien vers la partie du cours qui évoque cette notion ?
Concernant le cours sur l'administration d'une base de données avec MySQL, je bloque sur la dernière activité du cours.
Je souhaite implémenter un trigger dont voici le code :
DELIMITER |
CREATE TRIGGER after_insert_article AFTER INSERT
ON Article FOR EACH ROW
BEGIN
INSERT INTO VM_Nombre_com_article (article_id, nb_com)
VALUES (NEW.id, 0);
IF (New.resume IS NULL OR TRIM(New.resume) = '') THEN
UPDATE Article
SET resume = SUBSTR(New.contenu, 1, 150)
WHERE id = NEW.id;
END IF;
END |
DELIMITER ;
Je ne comprends pas pourquoi cela ne fonctionne pas. J'ai l'impression que :
soit le code dans IF n'est pas exécuté (ce qui signifierait que ma condition n'est jamais vérifiée, et pourtant !)
soit il est exécuté, mais MySQL me réponds avec un message d'erreur :
#1442 - Can't update table 'Article' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
Si vous avez la solution, du moins me mettre sur la voie, ce serait génial.
Bonjour, je suis à l'exercice des jointure de tables. Lorsque je fais
mysql> SELECT description FROM Espece WHERE id = 1;
+---------------------------------------------------------------------------+
| description |
+---------------------------------------------------------------------------+
| Bestiole à quatre pattes qui aime les caresses et tire souvent la langue |
+---------------------------------------------------------------------------+
1 row in set (0.00 sec)
Puis:
mysql> SELECT Espece.description
-> FROM Espece
-> INNER JOIN Animal
-> ON Espece.id = Animal.espece_id
-> WHERE Animal.nom = 'Cartouche';
Empty set (0.00 sec)
Je ne comprend pas pourquoi. Pouvez-vous m'aider SVP.
Bonjour ! Je travail sur l'activité partie 6 du cours sur MySQL, et je suis bloqué à la première consigne :
"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"
Donc j'ai créé une nouvelle colonne (nbre_de_comm) sur la table Article, puis j'ai écris la procédure suivante pour la remplir :
Et lorsque je vérifie j'obtiens un total de 6 commentaires :
Alors que je qu'il y en a 10...
Pouvez vous m'aidez à remplir correctement ma colonne s'il vous-plaît ?
Charly
- Edité par CharlyLerenard1 1 septembre 2017 à 0:25:03
@wakidaisho : Donc il n'y a aucun animal appelé Cartouche, c'est normal que ta requête ne remonte rien ...
@charlylerenard1 : La logique serait d'initialiser la valeur de la colonne nbre_de_comm une première fois, puis de mettre en place un TRIGGER AFTER INSERT ON commentaire et un TRIGGER AFTER DELETE ON commentaire, pour mettre à jour cette valeur à chaque nouveau commentaire.
Pour initialiser la valeur de ta colonne, ta procédure est farfelue ... Tu pourrais d'ailleurs faire cela sans procédure, avec un UPDATE avec une jointure sur une sous-requête :
UPDATE article A
INNER JOIN (
SELECT article_id, COUNT(*) AS nb_comment
FROM commentaire
GROUP BY article_id
) C
SET A.nbre_de_comm = C.nb_comment;
Et le TRIGGER contiendra un simple UPDATE utilisant l'article_id d'un nouveau commentaire :
UPDATE article
SET nbre_de_comm = nbre_de_comm + 1
WHERE id = NEW.article_id;
Et sur suppression d'un commentaire :
UPDATE article
SET nbre_de_comm = nbre_de_comm - 1
WHERE id = OLD.article_id;
Cela signifie que tu essayes d'insérer un animal avec une valeur pour espece_id (ici 12345) qui n'existe pas dans la table espece ... C'est le principe des clés étrangères ... Il faut que espece_id de la table animal corresponde à un id de la table espece ...
Je suis désolé, je suis en mode apprentis. Oui en effet, maintenant que tu le dis... C'est soit un chien, un chat, Tortue ou perroquet Ou j'insère une Espece 12345.
Vincent ERHART
Formateur / Développeur web