2

私は現在、何千ものデータパケットを処理するプロジェクトを行っています。ここで、これらの各パケットの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キーとして使用する方が良いと思います。問題は残っていますが、これは可能ですか?

4

2 に答える 2

7

この記事に基づくhttp://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

一般に、複数の一意のインデックスを持つテーブルでON DUPLICATEKEYUPDATE句を使用しないようにする必要があります。

挿入は、既存のIPを現在のIPに置き換えようとしますが、DBに既にあるため、MACを配置できません。例として、IP127.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 DUPLICATEKEYUPDATEを実行できます。

于 2013-03-25T15:24:04.730 に答える
2

私があなたの問題を正しく理解したかどうかわからない:

ip / macの各ペアを一意にしたい場合(それは理にかなっています) 、 2つの一意のキーではなく、構成された一意のキーが必要です。

DHCP環境では、各MACアドレスは時間の経過とともに複数のIPを持つことができます。

于 2013-03-25T15:33:11.110 に答える