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

时间:2012-05-28 04:42:12

标签: 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

如何将网络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 个答案:

答案 0 :(得分:10)

您可以将UPDATE IGNORE与更新语句一起使用 - 这将跳过导致重复的任何更新。然后,您将使用DELETE跟随此项以清除已跳过的行。例如:

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

来自documentation

  

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

答案 1 :(得分:5)

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

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

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