我正在做一个项目,我要经历数以千计的数据包.现在,我记录每个数据包的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键,原因有很多.问题仍然存在,这可能吗?
基于这篇文章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.