是否可以使用"delete from"语句合并两个记录?

Jon*_*eCA 9 mysql sql

我有一些连接到多个网络/ VLans(A,B和C)的网络设备,以及刚刚连接到其中一个网络的其他设备.当我删除或替换网络时,我需要更新我的数据库以反映设备所附加的内容,所以我正在尝试写一个mysql语句来做到这一点,但我遇到了各种路障.

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

deviceID network
1        A
1        B
1        C
2        B
2        C
3        A
4        A
5        B
Run Code Online (Sandbox Code Playgroud)

如何将网络A合并到网络B中,以便上表看起来像......

deviceID network
1        B
1        C
2        B
2        C
3        B
4        B
5        B
Run Code Online (Sandbox Code Playgroud)

我最初的尝试只是set network = 'B' where network = 'A',然后是一个DELETE network 'A'声明,但这将创建重复,这是不允许的表 - 即使重复是短暂的.使用替代方法,我只是通过使用WHERE EXISTS和各种FROM (SELECT)语句继续运行失败的mysql 语句.是否可以在单个mysql语句中执行?我需要两个吗?

任何帮助表示赞赏.

Pau*_*ora 10

您可以使用UPDATE IGNORE更新语句 - 这将跳过导致重复的任何更新.然后,您将使用a DELETE来清除已跳过的行.例如:

UPDATE IGNORE mytable SET network = 'B' WHERE network = 'A';
DELETE FROM mytable WHERE network = 'A';
Run Code Online (Sandbox Code Playgroud)

文档:

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


ajr*_*eal 5

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

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

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