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