Partage
  • Partager sur Facebook
  • Partager sur Twitter

creer index unique mysql sur deux table differente

avec une table jonjture

Sujet résolu
    6 septembre 2019 à 18:43:29

    Salut tout le monde , je suis entrain de réaliser la première activité du cours MySQL http://exercices.openclassrooms.com/assessment/218?id=1959476&slug=administrez-vos-bases-de-donnees-avec-mysql&login=8570456&tk=0b2bbff9695184e20cdc16818428c848&sbd=2016-02-01&sbdtk=fa78d6dd3126b956265a25af9b322d55, et je sens que j'avance bien ,juste un petit problème :

    je veux créer index unique sur le nom et la catégorie , de manière ce qu'une catégorie ne peux pas avoir deux article ayant le mémé nom , je sais pas vraiment comment faire car il y a 3 tables:

    • article
    • catégorie
    • catégorie_article (pour faire en sorte que chaque articles puisse appartenir a plusieurs catégorie et vice versa ).

    Edit :Est ce que cette solution est envisageable:

    créer une autre table ou le nom sera entré  avec une clé étrangère avec la table utilisateur  et une autre colonne pour id_catégorie avec une clé étrangère avec la table catégorie .

    Merci d'avance pour votre aide . 

    -
    Edité par PE-Belamy18 6 septembre 2019 à 18:53:27

    • Partager sur Facebook
    • Partager sur Twitter
      6 septembre 2019 à 22:06:04

      Bonjour,

      Ta table categorie_article ne joue-t-elle justement pas ce rôle ?

      • Partager sur Facebook
      • Partager sur Twitter
        6 septembre 2019 à 23:58:26

        le rôle que joue cette table , c'est assurer cette relation d'unicité entre l'id_article id_catégorie et non le titre .

        Que pensez-vous? 

        Votre aide est la bienvenue .

        -
        Edité par PE-Belamy18 7 septembre 2019 à 0:01:38

        • Partager sur Facebook
        • Partager sur Twitter
          9 septembre 2019 à 9:20:34

          Bonjour,

          Je ne suis pas sûr de comprendre ...

          PE-Belamy18 a écrit:

          une catégorie ne peux pas avoir deux article ayant le mémé nom

          Si tu veux qu'un article ne puisse être lié deux fois à la même catégorie, alors comme le dit philodick c'est le rôle de la table de relation article_categorie. Le fait de mettre sur cette table une clé primaire composée des deux colonnes (id_article ET id_categorie) assure cette contrainte ...

          En revanche si tu veux empêcher que l'on puisse enregistrer dans la table categorie deux fois les même libellé de catégorie avec des id différents, alors c'est bien un index UNIQUE qu'il faut placer sur la colonne categorie.nom_categorie ...

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            9 septembre 2019 à 20:59:58

            Mais même si  on insère dans la table catégori_article et refuse cela  , il sera déjà inséré dans la table article , c'est ce que je pense, sinon n'hésitez pas à m'expliquer d'avantage.merci.
            • Partager sur Facebook
            • Partager sur Twitter
              9 septembre 2019 à 23:49:47

              Je ne comprends pas .  

              Peux-tu donner un exemple de ce à quoi tu penses ?

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

                Par exemple : 

                On insère d'abord un article

                Insert into article (titre , résumé, texte) values ('noel','blabla','blablabla') ;

                Après on insère la catégorie dans la table article_categoorie

                Insert into artit_categirie (id,titre,id) values (1,'titre_existe_deja' , 5);

                Il sera bien-sûr refusé ,mais il sera déjà inséré dans la table article.

                Merci pour votre compréhension.

                • Partager sur Facebook
                • Partager sur Twitter
                  10 septembre 2019 à 21:02:02

                  Il ne doit pas y avoir de colonne titre dans la table article_categorie ...

                  article ( id , titre )

                  categorie ( id , nom )

                  article_categorie ( id_article, id_categorie )

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    10 septembre 2019 à 22:34:17

                    pouvez-vous me donner une requête un peu compléte pour réaliser tout cela: insérer un article ainsi que sa catégorie .

                    merci .

                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 septembre 2019 à 23:44:17

                      Les catégories existent dans la table categorie chacune avec son ID propre.

                      Le formulaire de création d'un article doit proposer la liste des catégories existantes avec par exemple des cases à cocher. L'utilisateur coche les cases des catégories qu'il veut pour son article, et renseigne le titre et le contenu de l'article puis valide le formulaire.

                      Ensuite tu récupères tout cela, tu insères l'article,  tu récupères l'id de cet article et tu insères dans la table de relation tous les id de categorie  cochés avec l'id de l'article juste créé.

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

                        Benzouye a écrit:

                        Si tu veux qu'un article ne puisse être lié deux fois à la même catégorie, alors comme le dit philodick c'est le rôle de la table de relation article_categorie

                        En faite ce que je veux , ce n'est pas ça , mais plutôt ça :

                        il ne peut pas y avoir le même nom d'un article dans une seul catégorie , par contre , le nom peut se répéter s'il s'agit d'une autre catégorie .

                        Merci pour votre compréhension .



                        -
                        Edité par PE-Belamy18 11 septembre 2019 à 19:33:26

                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 septembre 2019 à 0:07:27

                          Je suis désolé mais je n'arrive vraiment pas à comprendre...

                          Peux-tu donner un exemple concret d'articles et de catégories qui montre ce que tu veux faire et ce que tu veux empêcher ?

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                            12 septembre 2019 à 9:03:55

                            Il faudrait savoir si quand deux articles ont le même nom, est-ce que seul le nom est commun aux deux (donc les autres colonnes différentes), ou s'agit-il du même article (toutes les colonnes identiques) qui peut appartenir à des catégories différentes.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              12 septembre 2019 à 16:46:17

                              PE-Belamy18 a écrit:

                              Benzouye a écrit:

                              Si tu veux qu'un article ne puisse être lié deux fois à la même catégorie, alors comme le dit philodick c'est le rôle de la table de relation article_categorie

                              En faite ce que je veux , ce n'est pas ça , mais plutôt ça :

                              il ne peut pas y avoir le même nom d'un article dans une seul catégorie , par contre , le nom peut se répéter s'il s'agit d'une autre catégorie .

                              Merci pour votre compréhension .



                              -
                              Edité par PE-Belamy18 il y a environ 21 heures


                              Salut,

                              si tu prends exemple sur OC, tu peux très bien avoir 2 topics qui portent le même titre sans que cela n'impacte le fonctionnement. Il n'est pas interdit à 2 journalistes de donner le même titre à deux articles différents dans la même catégorie, après le filtre n'est plus informatique là.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                12 septembre 2019 à 21:22:21

                                Je donne un exemple :

                                J'insère d'abord un article : 

                                Nom : informatique

                                Catégorie :  technologie

                                Après un autre article

                                Nom: informatique

                                Catégorie : culture

                                Sans problème , car il s'agit de deux catégories différentes .mais essayons ça 

                                Nom : informatique

                                Catégorie : technologie 

                                Je voudrais que cette insertion soit impossible . Je pense que c'est clair un peu.

                                Merci.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  13 septembre 2019 à 1:06:15

                                  Ok je comprend mieux, même si ton besoin paraît curieux comme le souligne christouphe.

                                  Pour faire ce que tu veux je ne vois pas d'autre moyen que de créer un TRIGGER BEFORE INSERT ON article_categorie et qui lève une erreur (SIGNAL) si les libellés couplés existent déjà...

                                  • 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 septembre 2019 à 8:45:52

                                    philodick a écrit:

                                    Il faudrait savoir si quand deux articles ont le même nom, est-ce que seul le nom est commun aux deux (donc les autres colonnes différentes), ou s'agit-il du même article (toutes les colonnes identiques) qui peut appartenir à des catégories différentes.



                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      13 septembre 2019 à 16:32:08

                                      Pouvez-vous Benzouye me donner un exemple. Je ne sais pas comment écrire cette requête . Merci
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        13 septembre 2019 à 17:29:08

                                        Je vais me baser sur ce modèle :

                                        CREATE TABLE article (
                                        	id INT UNSIGNED AUTO_INCREMENT NOT NULL,
                                        	titre VARCHAR(60) NOT NULL,
                                        	contenu TEXT NOT NULL,
                                        	PRIMARY KEY ( id )
                                        ) ENGINE=INNODB;
                                        
                                        CREATE TABLE categorie (
                                        	id INT UNSIGNED AUTO_INCREMENT NOT NULL,
                                        	libelle VARCHAR(60) NOT NULL,
                                        	PRIMARY KEY ( id )
                                        ) ENGINE=INNODB;
                                        
                                        CREATE TABLE article_categorie (
                                        	id_article INT UNSIGNED NOT NULL,
                                        	id_categorie INT UNSIGNED NOT NULL,
                                        	PRIMARY KEY ( id_article, id_categorie ),
                                        	FOREIGN KEY ( id_article ) REFERENCES article ( id ),
                                        	FOREIGN KEY ( id_categorie ) REFERENCES categorie ( id )
                                        ) ENGINE=INNODB;

                                        On va reprendre ton exemple précédent avec les articles "informatique" :

                                        INSERT INTO article ( id, titre, contenu )
                                        VALUES
                                        ( 1, 'Informatique', 'Ceci est un article parlant de technologie informatique' ),
                                        ( 2, 'Informatique', 'Ceci est un article parlant de culture informatique' );
                                        
                                        INSERT INTO categorie ( id, libelle )
                                        VALUES
                                        ( 1, 'Technologie' ),
                                        ( 2, 'Culture' );
                                        
                                        INSERT INTO article_categorie ( id_article, id_categorie )
                                        VALUES
                                        ( 1, 1 ),
                                        ( 2, 2 );

                                        On crée les trois tables, on crée deux articles et deux catégories, et on relie chaque article à une catégorie.

                                        Maintenant on va créer un TRIGGER qui contrôle que l'on ne crée pas deux articles avec le même titre et la même catégorie :

                                        DELIMITER &&
                                        
                                        CREATE TRIGGER controle_titre_categorie
                                        BEFORE INSERT ON article_categorie
                                        FOR EACH ROW
                                        BEGIN
                                        	-- Recherche un article du même titre
                                        	-- Dans la même catégorie
                                        	SELECT COUNT(*) INTO @nombre
                                        	FROM
                                        		article_categorie AC
                                        			INNER JOIN article A
                                        				ON AC.id_article = A.id
                                        	WHERE
                                        		AC.id_categorie = NEW.id_categorie
                                        		AND A.titre = (
                                        			SELECT titre
                                        			FROM article
                                        			WHERE id = NEW.id_article
                                        		);
                                        	
                                        	-- Si il y en a on lève une erreur
                                        	IF @nombre > 0 THEN
                                        		SIGNAL SQLSTATE '23000'
                                        			SET MESSAGE_TEXT = 'Un article du même titre existe déjà pour cette catégorie';
                                        	END IF;
                                        END&&
                                        
                                        DELIMITER ;

                                        Une fois le TRIGGER en place, on peut essayer. On ajoute un troisième article et une troisième catégorie :

                                        INSERT INTO article ( id, titre, contenu )
                                        VALUES ( 3, 'Informatique', 'Encore un article qui parle informatique' );
                                        
                                        INSERT INTO categorie ( id, libelle )
                                        VALUES ( 3, 'Science' );

                                        Et pour tester le TRIGGER on essaye de lier les articles :

                                        INSERT INTO article ( id, titre, contenu )
                                        VALUES ( 3, 'Informatique', 'Encore un article qui parle informatique' );
                                        
                                        INSERT INTO categorie ( id, libelle )
                                        VALUES ( 3, 'Science' );
                                        
                                        INSERT INTO article_categorie ( id_article, id_categorie )
                                        VALUES
                                        ( 3, 1 ), -- va lever une erreur
                                        ( 2, 1 ), -- va lever une erreur
                                        ( 1, 2 ), -- va lever une erreur
                                        ( 3, 3 ); -- va fonctionner

                                        Cela me fait un peu mal de te montrer cela ... C'est un peu bourrin ...

                                        Es-tu vraiment sûr qu'un article pourra être en même temps dans plusieurs catégories ? Si non cela peut grandement simplifier le problème ...

                                        • 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 septembre 2019 à 20:28:02

                                          Ça y est avec votre exemple , je comprends très bien . Je vous remercie tous pour vos efforts afin de m'expliquer .
                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          creer index unique mysql sur deux table differente

                                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                          • Editeur
                                          • Markdown