9

我有一些连接到多个网络/VLans(A、B 和 C)的联网设备,以及仅连接到其中一个网络的其他设备。当我删除或更换网络时,我需要更新我的数据库以反映设备所连接的内容,所以我试图编写一个 mysql 语句来做到这一点,但我遇到了各种障碍。

我的表只有两个字段,不能有重复记录。我的数据示例是

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'语句,但这会创建重复项,该表不允许这样做 - 即使重复项很简短。使用替代方法,我只是通过 usingWHERE EXISTS和各种语句不断遇到失败的 mysqlFROM (SELECT)语句。是否可以在单个 mysql 语句中执行?我需要两个吗?

任何帮助表示赞赏。

4

2 回答 2

10

您可以使用UPDATE IGNORE更新语句 - 这将跳过任何导致重复的更新。然后,您将在此之后使用 aDELETE清除已跳过的行。例如:

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

文档中:

使用IGNORE关键字,即使更新期间发生错误,更新语句也不会中止。不会更新发生重复键冲突的行。将其列更新为会导致数据转换错误的值的行改为更新为最接近的有效值。

于 2012-05-28T05:02:41.877 回答
5

您可以考虑将其设为三列,而不是两列
(唯一键保持不变)

  • 设备编号
  • 网络
  • 状态 (1,0)

因此,每当设备被移除/更换时,
您将状态标记为 0,
当然,要检索正确的列表,status=1是必需的

于 2012-05-28T04:56:13.533 回答