我正在做一个项目,我要经历数千个数据包。现在,我记录每个数据包的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键。问题仍然存在,这可能吗?
答案 0 :(得分: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。
答案 1 :(得分:2)
不确定我是否正确理解了您的问题:
如果你想要每对的ip / mac是唯一的(这是有意义的)你必须有一个组合的唯一键而不是两个唯一键,因为你有
在DHCP环境中,每个MAC地址可以/将随时间推移有多个IP。