9

複数のネットワーク/VLan (A、B & C) に接続されているネットワーク機器と、ネットワークの 1 つに接続されている他の機器があります。ネットワークを削除または交換するとき、機器が接続されているものを反映するようにデータベースを更新する必要があるため、それを行うための mysql ステートメントを作成しようとしていますが、さまざまな障害に遭遇しています。

私のテーブルには 2 つのフィールドしかなく、重複するレコードはあり得ません。私のデータの例は

deviceID network
1        A
1        B
1        C
2        B
2        C
3        A
4        A
5        B

上記の表が次のようになるように、ネットワーク A をネットワーク B にマージするにはどうすればよいですか...

deviceID network
1        B
1        C
2        B
2        C
3        B
4        B
5        B

私の最初の試みはset network = 'B' where network = 'A'、ステートメントが続くだけDELETE network 'A'でしたが、そのテーブルでは許可されていない重複が作成されます-重複は簡単ですが。別の方法を使用するWHERE EXISTSと、さまざまなFROM (SELECT)ステートメントを使用して失敗した mysql ステートメントに遭遇し続けます。単一のmysqlステートメントで行うことは可能ですか? 2つ必要ですか?

どんな助けでも大歓迎です。

4

2 に答える 2

10

update ステートメントで使用できますUPDATE IGNORE-これにより、重複の原因となった更新がスキップされます。DELETE次に、スキップされた行をクリアするために aを続けます。例えば:

UPDATE IGNORE mytable SET network = 'B' WHERE network = 'A';
DELETE FROM mytable WHERE network = 'A';

ドキュメントから:

キーワードを使用するIGNOREと、更新中にエラーが発生しても update ステートメントは中止されません。重複キーの競合が発生した行は更新されません。列がデータ変換エラーの原因となる値に更新される行は、代わりに最も近い有効な値に更新されます。

于 2012-05-28T05:02:41.877 に答える
5

Instead of having two columns, you can consider make it three columns as
(the unique key remain unchanged)

  • deviceID
  • network
  • status (1,0)

so, whenever a device has been removed / replaced,
you then mark the status to 0,
of course, to retrive the correct listing, status=1 is required

于 2012-05-28T04:56:13.533 に答える