2

我目前正在做一个项目,我正在处理数千个数据包。现在,我记录每个数据包的 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 地址作为唯一键可能会更好。但问题仍然存在,这可能吗?

4

2 回答 2

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 地址已存在于数据库中,因此无法完成更新。

希望我能很好地解释它:)

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

于 2013-03-25T15:24:04.730 回答
2

不确定我是否正确理解了您的问题:

如果您希望每对ip/mac 都是唯一的(这是有道理的),您必须拥有一个组合的唯一键,而不是像您拥有的两个唯一键。

在 DHCP 环境中,随着时间的推移,每个 MAC 地址可以/将拥有多个 IP。

于 2013-03-25T15:33:11.110 回答