MySQL:从一个表中插入/更新多行

MySQL:从一个表中插入/更新多行,mysql,Mysql,我有一个设备系统,用户可以在其中选择一个设备,并在其帐户上最多存储10个设备。一次只能有一个设备处于活动状态 我正试图找到正确的MySQL查询,根据用户选择的设备插入/更新下面的userdevice表;添加任何新设备(作为活动设备)(如果该设备尚未在其帐户上),并使其帐户上的任何其他设备处于非活动状态(0) $userId、$newDeviceId和$oldActiveDeviceId可用于构造查询 CREATE TABLE IF NOT EXISTS `userdevice` ( `use

我有一个设备系统,用户可以在其中选择一个设备,并在其帐户上最多存储10个设备。一次只能有一个设备处于活动状态

我正试图找到正确的MySQL查询,根据用户选择的设备插入/更新下面的userdevice表;添加任何新设备(作为活动设备)(如果该设备尚未在其帐户上),并使其帐户上的任何其他设备处于非活动状态(0)

$userId、$newDeviceId和$oldActiveDeviceId可用于构造查询

CREATE TABLE IF NOT EXISTS `userdevice` (
  `userid` int(11) NOT NULL,
  `deviceid` int(11) NOT NULL,
  `dateadded` datetime NOT NULL,
  `datelastactive` datetime NOT NULL,
  `active` tinyint(4) NOT NULL,
  PRIMARY KEY (`userid`,`deviceid`),
  KEY `active` (`active`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
一些样本数据:

INSERT INTO `userdevice` (`userid`, `deviceid`, `dateadded`, `datelastactive`, `active`)         VALUES
(1, 1294, '2013-01-17 02:46:09', '2013-01-17 02:48:00', 1),
(1, 1307, '2013-01-17 02:45:24', '2013-01-17 02:45:00', 0),
(1, 1760, '2013-01-17 02:40:45', '2013-01-17 02:42:00', 0);
我提出了以下查询,但在更新oldActiveDeviceId时,它当然会重置“datelastactive”字段:

INSERT INTO userdevice
(userid, deviceid, dateadded, datelastactive, active
VALUES
($userId,$newestDeviceId,NOW(),NOW(),1), 
($userId,$oldActiveDeviceId,'','',0)
ON DUPLICATE KEY
UPDATE datelastactive = VALUES(datelastactive), active = VALUES(active)
另一个问题是,它允许两个设备处于活动状态


非常感谢您的帮助。

若要修复datelastactive,请将datelastactive更改为NOW()

单个活动记录:


确保单个活动记录的最佳建议是将其保存在单独的数据库中。这可能需要您对表进行一些更新。例如,您可能需要添加一个ID作为主键,然后将userid/deviceid设置为唯一。

这是可行的,但它会在两行上更新datelastactive=NOW(),我只希望该行上的ID处于活动状态(很抱歉不清楚)。我将其替换为:datelastactive=IF(VALUES(datelastactive)INSERT INTO userdevice (userid, deviceid, dateadded, datelastactive, active VALUES ($userId,$newestDeviceId,NOW(),NOW(),1), ($userId,$oldActiveDeviceId,'','',0) ON DUPLICATE KEY UPDATE datelastactive = NOW(), active = VALUES(active)