mysql - 出现 'Duplicate entry' 错误,即使我正在使用 ON DUPLICATE KEY UPDATE

标签 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'

即使我正在使用 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$$

这是我在 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]);

我真的想不出让这个工作的方法。

更新:出于多种原因,我认为使用 IP 地址作为 UNIQUE 键可能更好。但问题仍然存在,这可能吗?

最佳答案

基于这篇文章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”的记录 您插入一 strip 有此 IP 和 MAC 地址“ff:ff:ff:ff:ff:ff”的新记录。 MySQL 将 IP 记录更新为相同的 IP - 127.0.0.1,但无法完成更新,因为该 MAC 地址已存在于数据库中。

希望我解释得很好 :)

如果 IP 地址与 MAC 地址的关系是 1:1,则他们应该使用复合 key ,然后您可以进行重复 key 更新。

关于mysql - 出现 'Duplicate entry' 错误,即使我正在使用 ON DUPLICATE KEY UPDATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15618313/

相关文章:

php - onbeforeprint() 和 onafterprint() 等同于非 IE 浏览器

php - 如何从数据库中获取值、对它们求和并在 codeigniter 中显示它们?

sql - HQL 选择使用日期作为标准错误

node.js - 使用 npm 卸载 babel-cli 失败

php - 提交详细信息后如何检索 id

C# Dapper - 这个 MySql 有什么问题?

mysql - SQL 触发器错误

java - Postgresql/Java 比较数据库中的用户名和散列密码

node.js - 设置后取消 Node 调度事件

node.js - 我收到 SQLITE_Error : no such column, 但它存在为什么?