私は現在、何千ものデータパケットを処理するプロジェクトを行っています。ここで、これらの各パケットのIPアドレスとMACアドレスを他の情報とともにログに記録します。これらすべてを保存するために、MySQLを使用し、スクリプトはNode.jsで記述されています。現在、1秒あたり40kをはるかに超えるパケットを処理しているため、データベーストラフィックはかなり激しくなります。ここで注意が必要なのは、IPアドレスとMACアドレスをリンクして、テーブルに1回だけ存在するようにすることです。したがって、両方を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_mysqlライブラリを使用したNode.jsでの私のクエリです。
mysqlConnection.query('INSERT INTO ' + mysqlTable + ' (ip, mac, method) VALUES(?, ?, ?) ON DUPLICATE KEY UPDATE ip=?, mac=?, method=?',
[ipAddress, macAddress, method, ipAddress, macAddress, method]);
私はこれを機能させる方法を本当に理解できません。
更新:いくつかの理由から、IPアドレスをUNIQUEキーとして使用する方が良いと思います。問題は残っていますが、これは可能ですか?