准备好的声明:使用Where复制密钥更新

时间:2015-08-25 17:08:41

标签: mysql sql

我有这些表格:

stundenplan
+----+---------+-------+--------+---------+---------+------+
| id | user_id | tag   | stunde | fach    | lehrer  | raum |
+----+---------+-------+--------+---------+---------+------+
|  1 |       1 |     1 |      1 | MATH    | SM      | 101  |
|  2 |       1 |     1 |      2 | MATH    | SM      | 101  |
|  3 |       1 |     1 |      3 | MATH    | SM      | 101  |
|  4 |       1 |     1 |      4 | MATH    | SM      | 101  |
|  5 |       1 |     1 |      5 | MATH    | SM      | 101  |
|  6 |       1 |     1 |      6 | MATH    | SM      | 101  |
|  7 |       1 |     2 |      1 | MATH    | SM      | 101  |
|  8 |       1 |     2 |      2 | MATH    | SM      | 101  |
| .. |     ... |   ... |    ... |     ... |     ... |  ... |

users
+---------+----------+----
| user_id | username | ...
+---------+----------+----
|       1 | User1    | ...
+---------+----------+----

我的查询(由于更新部分中缺少user_id,因此对我没有意义):

$sql = $db->prepare("
INSERT INTO stundenplan
    (tag, stunde, user_id, fach, lehrer, raum )
VALUES
    (?, ?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
    fach = VALUES(fach),
    lehrer = VALUES(lehrer),
    raum = VALUES(raum)
");
$sql->bind_param('iiissi', $input_tag, $input_stunde, $input_fach, $input_lehrer, $input_raum);

如果我必须插入一些内容,那么查询就是:

INSERT INTO stundenplan (tag, stunde, user_id, fach, lehrer, raum) VALUES (?, ?, ?, ?, ?, ?)

如果我必须更新查询,请执行以下操作:

UPDATE stundenplan SET fach = ?, lehrer = ?, raum = ? WHERE user_id = ?

如何将这两个查询组合成我之前尝试过的查询?

1 个答案:

答案 0 :(得分:0)

我只在SQL部分做过(你的查询是正确的,但是我按user_id扩展了密钥):

    INSERT INTO stundenplan
       (tag, stunde, user_id, fach, lehrer, raum )
    VALUES
       (1,1,1,'MATH_NEW','SM',101)
    ON DUPLICATE KEY UPDATE
       fach = VALUES(fach),
       lehrer = VALUES(lehrer),
       raum = VALUES(raum);

请查看下面的演示。它在架构构建部件上使用ON DUPLICATE KEY UPDATE,在插入时使用静态值(在1,1,1值上复制)。执行select语句后,您可以看到值已正确更新。

DEMO HERE

问题是您无法修改此查询中的UPDATE条件(它们与检测到的重复项完全相同)。所以几乎没有可能的解决方案,都包含2个查询和事务:

  • stundenplan删除重复的行并重新插入
  • 插入不重复的行,然后更新重复项。

我还找到了一篇关于花式插入/更新HERE

的文章