【发布时间】:2013-03-15 03:23:24
【问题描述】:
我目前正在做一个项目,我正在处理数千个数据包。现在,我记录每个数据包的 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 地址作为唯一键可能会更好。但问题仍然存在,这可能吗?
【问题讨论】:
-
我猜你对 ip 和 mac 有一个 UNIQUE 约束。您插入具有现有 ip 的行,它会尝试将其更新为新的 mac,该 mac 也存在但在另一行。不确定这是否有意义......
-
这里dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html 是状态 通常,您应该尽量避免在具有多个唯一索引的表上使用 ON DUPLICATE KEY UPDATE 子句。
-
你的桌子想要完成什么? MACIP 映射不是 1:1,尤其是在 DHCP 环境中。
-
@MarcB 我希望索引始终是最新的。如果用户被分配了一个新的 IP。但你可能正在做某事。我应该完全放弃 MAC 和 IP 之间的 1:1 关系吗?哪个应该是主键?