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
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 ...
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.
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éé.
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
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.
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à.
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à...
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.
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 ...
Ça y est avec votre exemple , je comprends très bien . Je vous remercie tous pour vos efforts afin de m'expliquer .
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.
N'oubliez pas d'activer les erreurs PDO.
N'oubliez pas d'activer les erreurs PDO.
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
N'oubliez pas d'activer les erreurs PDO.