MySQL:当对不在对列表中时更新(没有主键)


MySQL: Update when pair NOT IN list of pairs (no primary key)

我相信这个问题有一个简单的解决方案,但我在解决这个问题时遇到了一些麻烦。

背景

我有一个具有以下模式的表(经过删节,因为实际上数据是由多个表的联接创建的):

Order |  Item  |  Shipped
1        1         N
1        2         N
2        1         N
2        5         N
5        6         N
5        2         N
        ...

模式说明:

  • 每一行都由一个订单+项目唯一标识,但这并不是一个主键
  • 此外,表上没有主键,我也不能添加主键(MySQL DB是来自遗留系统的盲转储)

问题

我需要一种方法来将Shipped列设置为'Y',如果订单+项目对不存在于订单+项目配对的列表中。

换句话说,我将在其他地方有一个PHP脚本,生成类似(为了可读性而编辑)的内容:

array(
  'Order1' => array(1),
  'Order5' => array(2, 6)
);

当我运行查询时,我应该得到以下表结构:

Order |  Item  |  Shipped
1        1         N
1        2         Y
2        1         Y
2        5         Y
5        6         N
5        2         N
        ...

的"直观"解决方案

UPDATE MyTable
SET Shipped='Y'
WHERE
Order NOT IN (1, 5)
AND Item NOT IN (1, 2, 6);

显然不起作用(因为它不会将订单#2中的项目#1标记为已发货)。

应该是这个

UPDATE MyTable
SET Shipped='Y'
WHERE (order, item) not in((1,2), (2,1)... )

((1,2),(2,1)…)==您的列表。。可能是正确选择或正确字符串的结果

您可以根据输入数组创建条件列表:

UPDATE MyTable
SET Shipped='Y'
WHERE NOT
 ( 
   ( Order  = 1 AND Item IN (1))
  OR
   ( Order  = 5 AND Item IN (2,6))
 )