PHP/PDO/SQL Update avec Foreign Key

Petit nouveau ! | 1 Messages

24 oct. 2015, 19:41

Bonjour,

La question comment faire le update ?

J'ai 3 tables 'article', 'categories' et 'artcategories'. Dans la table artCategories contient des foreign key 'article_id' et 'category_id' => Un article peut avoir plusieurs categories et une category peut appartenir à plusieurs articles.

Donc je cherche à savoir comment par exemple faire un UPDATE sur la 'artCategories' ?

Code : Tout sélectionner

UPDATE artCategories SET category_id=1 WHERE article_id = 10;
Mais ce code me renvoie une erreur duplicate entry, que je comprend très bien puisque j'ai plusieurs entrées avec article_id = 10 et comme ça fonctionne avec des foreign key en CASCADE sur Update et restrict avec delete.

Table articles : article_id, title, content, created_by, last_update, etc.. PRIMARY KEY (article_id)

Table : categories : category_id, name, last_update PRIMARY KEY (category_id)

Table : articles_categories : article_id, category_id, last update;

Structure de la table articles_categories :

Code : Tout sélectionner

CREATE TABLE IF NOT EXISTS `articles_categories` ( `article_id` smallint(5) unsigned NOT NULL, `category_id` tinyint(3) unsigned NOT NULL, `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`article_id`,`category_id`), KEY `fk_article_category_category` (`category_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-----------------
Jusque la, je suis arrivé à le faire fonctionner mais c'est pas vraiment ça car 1 fois sur 2 ça renvie une erreur, donc si vous pouvez me corriger sur la structure des tables, la requetes et complètement sur le php..je suis preneur.

Code : Tout sélectionner

UPDATE articles a LEFT JOIN aticles_categories ac ON a.article_id = ac.article_id LEFT JOIN categories c ON c.category_id = ac.category_id SET ac.category_id = :new, ac.last_update = NOW() WHERE (ac.category_id = :old AND a.article_id = :id)

Mammouth du PHP | 1029 Messages

09 nov. 2015, 16:58

En SQL le Update, comme le INSERT ou DELETE ne se fait que sur une table, donc toutes tes jointure ne serve pas à grand chose.
Ceci est plus judicieux :

Code : Tout sélectionner

UPDATE aticles_categories ac    SET ac.category_id = :new, ac.last_update = NOW()   WHERE ac.category_id = :old 
L'expérience est la somme de toutes nos erreurs.