即使我使用ON DUPLICATE KEY UPDATE,也会出现"重复输入"错误

Fre*_*efl 2 mysql sql node.js

我正在做一个项目,我要经历数以千计的数据包.现在,我记录每个数据包的IP和MAC地址以及其他一些信息.要存储所有这些,我使用MySQL,我的脚本是用Node.js编写的.目前我每秒处理超过40k的数据包,因此数据库流量非常紧张.现在,棘手的部分是IP和MAC地址应该链接在一起,因此它们只在表中存在一次.因此我将它们都设置为UNIQUE.但是,当我查询数据库时,我收到一个错误:

Error: ER_DUP_ENTRY: Duplicate entry 'ff:ff:ff:ff:ff:ff' for key 'mac_UNIQUE'
Run Code Online (Sandbox Code Playgroud)

即使我正在使用ON DUPLICATE KEY UPDATE它,它也会吐出错误.我的数据库设置如下:

delimiter $$

CREATE TABLE `hosts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ip` varchar(45) NOT NULL DEFAULT '',
  `mac` varchar(45) NOT NULL DEFAULT '',
  `method` varchar(45) DEFAULT NULL,
  `netbiosName` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ip_UNIQUE` (`ip`),
  UNIQUE KEY `mac_UNIQUE` (`mac`)
) ENGINE=InnoDB AUTO_INCREMENT=1862 DEFAULT CHARSET=latin1$$
Run Code Online (Sandbox Code Playgroud)

这是我在Node.js中使用node_mysql库的查询:

mysqlConnection.query('INSERT INTO ' + mysqlTable + ' (ip, mac, method) VALUES(?, ?, ?) ON DUPLICATE KEY UPDATE ip=?, mac=?, method=?',
                    [ipAddress, macAddress, method, ipAddress, macAddress, method]);
Run Code Online (Sandbox Code Playgroud)

我真的无法想办法让这个工作起来.

更新:我认为我可能更好地使用IP地址作为UNIQUE键,原因有很多.问题仍然存在,这可能吗?

Yas*_*lev 7

基于这篇文章http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

通常,您应该尝试避免在具有多个唯一索引的表上使用ON DUPLICATE KEY UPDATE子句.

插入尝试用您当前的IP替换现有的IP,但是然后无法将MAC放在您的数据库中.例如,您有一个IP 127.0.0.1的记录.并且你有一个MAC地址'ff:ff:ff:ff:ff:ff'的记录你用这个IP和MAC地址插入一条新记录'ff:ff:ff:ff:ff:ff'.MySQL使用IP将记录更新为相同的IP-127.0.0.1,但由于此MAC地址已存在于DB中,因此无法完成更新.

希望我设法解释得很好:)

如果IP地址与MAC地址的关系是1:1,则应使用复合密钥,然后可以执行ON DUPLICATE KEY UPDATE.