unique Le tableau est la suivante:MySQL conflits UPDATE avec clé
CREATE TABLE `ToursCartsItems` (
`Id` int(10) unsigned NOT NULL auto_increment,
`UserId` char(40) default NULL,
`TourId` int(10) unsigned NOT NULL,
`CreatedAt` int(10) unsigned default NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `UniqueUserProduct` (`UserId`,`TourId`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED
// simple sample data
INSERT INTO
ToursCartsItems (UserId, TourId)
VALUES
("old", 1), ("old", 2), ("new", 1), ("new", 3);
Ainsi, un utilisateur peut posséder de nombreuses visites (jamais l'esprit ce que les visites sont). Le champ UserId est un char
, pas un int
, car l'utilisateur n'est peut-être pas connecté, auquel cas l'ID de session est utilisé.
Lorsqu'un utilisateur se connecte, son ID utilisateur change. Donc, la mise à jour simple serait
UPDATE ToursCartsItems SET UserId="new" WHERE UserId="old"
-- In reality, the new UserId would be an integer, but never mind that.
Mais cela pourrait donner une clé d'entrée en double. Lorsque l'ancien utilisateur et le nouvel utilisateur ont la même visite, nous devrions en déposer un avant la mise à jour.
J'ai essayé
UPDATE ToursCartsItems
SET UserId="in"
WHERE UserId="out"
AND (TourId NOT IN (SELECT TourId FROM ToursCartsItems WHERE UserId="in")
);
DELETE FROM ToursCartsItems WHERE UserId="old";
et
TRUNCATE ToursCartsItems;
INSERT INTO ToursCartsItems (UserId, TourId) VALUES ("old", 1), ("old", 2), ("new", 1), ("new", 3);
DELETE FROM ToursCartsItems WHERE UserId="old" AND TourId IN (SELECT TourId FROM ToursCartsItems WHERE UserId="new");
UPDATE ToursCartsItems SET UserId="new" WHERE UserId="old";
Les deux me donnent des erreurs. Est-il possible de le faire dans la requête SQL elle-même, ou dois-je juste faire
SELECT * FROM ToursCartsItems WHERE UserId IN ("old", "new")
puis faire moi-même les calculs nécessaires en PHP?
Pourriez-vous s'il vous plaît partager l'erreur que vous obtenez pour la première mise à jour? –