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

时间:2013-01-17 03:22:06

标签: mysql

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

我正在尝试根据用户选择的设备提出正确的MySQL查询来插入/更新以下用户设备表;添加任何新设备(已激活),如果它们尚未在其帐户中,并使其帐户上的任何其他设备处于非活动状态(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)

另一个问题是它允许两个设备处于活动状态。

我很感激任何帮助。

1 个答案:

答案 0 :(得分:0)

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

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)

单一活动记录:

确保单个活动记录的最佳建议是将其保留在单独的child record table中。这可能需要您稍微更新您的表。例如,您可能需要添加一个ID作为PK,然后将userid / deviceid设置为UNIQUE。