表MySQL的更新衝突如下:具有獨特的鍵
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);
所以一個用戶可以擁有許多旅行團(別提是什麼旅行團)。 UserId字段是char
而不是int
,因爲用戶可能未登錄,在這種情況下會話ID被使用。
當用戶登錄時,其用戶ID將發生變化。所以簡單的更新將是
UPDATE ToursCartsItems SET UserId="new" WHERE UserId="old"
-- In reality, the new UserId would be an integer, but never mind that.
但是,這可能會給一個重複的輸入密鑰。舊用戶和新用戶都具有相同的導覽,我們應該在更新之前刪除一個。
所以我已經試過
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";
和
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";
兩個給我的錯誤。有沒有辦法在SQL查詢本身要做到這一點,還是我只需要做
SELECT * FROM ToursCartsItems WHERE UserId IN ("old", "new")
,然後做必要的計算自己在PHP?
請問您可以分享您獲得第一次更新的錯誤嗎? – 2010-12-15 19:13:56