具有多个值的MySQL Update以及where子句

时间:2017-04-18 15:11:09

标签: mysql sql

我很难过。我已经阅读了很多与此类似的不同问题,但仍然无法解决问题。

以下是之前表格的摘要。 (的 POs_Parts

+-------+------------+----------+---------+-------+----------+
| p_Key | f_key_part | f_key_po | partQty | r_qty | r_author |
+-------+------------+----------+---------+-------+----------+
|     0 |         18 |        6 |       2 |     0 | NULL     |
|     1 |         19 |        6 |       3 |     0 | NULL     |
|     2 |         20 |        6 |       1 |     0 | NULL     |
|     3 |         18 |        8 |       1 |     0 | NULL     |
+-------+------------+----------+---------+-------+----------+

以下是我希望在更新语句之后 的方式。 (最后两列已更新)

+-------+------------+----------+---------+-------+----------+
| p_Key | f_key_part | f_key_po | partQty | r_qty | r_author |
+-------+------------+----------+---------+-------+----------+
|     0 |         18 |        6 |       2 |     2 | John     |
|     1 |         19 |        6 |       3 |     2 | John     |
|     2 |         20 |        6 |       1 |     0 | John     |
|     3 |         18 |        8 |       1 |     1 | John     |
+-------+------------+----------+---------+-------+----------+

我认为这句话符合我的要求 - 一行 - 但我有大量的行需要一次更改,所以我想避免执行一次一个语句。

UPDATE POs_Parts SET r_qty = 2, r_author='John' where f_key_part = 18 and f_key_po = 6;

这是我试图用作参考的问题。 Multiple Updates in MySQL

如何在不运行一堆Update语句的情况下重写此内容?我将使用PHP来创建查询。任何建议将不胜感激。

1 个答案:

答案 0 :(得分:3)

如果您遵循链接的引用,则SQL将类似于

INSERT INTO
    POs_Parts (p_Key, f_key_part, f_key_po, partQty, r_qty, r_author)
VALUES
    (0, 18, 6, 2, 2, 'John'),
    (1, 19, 6, 3, 2, 'John'),
    (2, 20, 6, 1, 0, 'John'),
    (3, 18, 8, 1, 1, 'John')
ON DUPLICATE KEY UPDATE
    f_key_part = VALUES(f_key_part),
    f_key_po = VALUES(f_key_po),
    partQty = VALUES(partQty),
    r_qty = VALUES(r_qty),
    r_author = VALUES(r_author)

(你可能可以省略未更改的列 - 我还没有对此进行过测试或曾经使用过这样的语法。~~ 编辑:你不能省略列 ~~编辑2 :您可以省略列。请参阅下面的更新语法。)

我认为你会发现"一堆SQL语句"是一条更直接的路线。

这是我的测试:

MariaDB [test]> select * from POs_Parts;
+-------+------------+----------+---------+-------+----------+
| p_Key | f_key_part | f_key_po | partQty | r_qty | r_author |
+-------+------------+----------+---------+-------+----------+
|     0 |         18 |        6 |       2 |     0 | NULL     |
|     1 |         19 |        6 |       3 |     0 | NULL     |
|     2 |         20 |        6 |       1 |     0 | NULL     |
|     3 |         18 |        8 |       1 |     0 | NULL     |
+-------+------------+----------+---------+-------+----------+
4 rows in set (0.00 sec)

MariaDB [test]> INSERT INTO POs_Parts (p_Key, f_key_part, f_key_po, partQty, r_qty, r_author) VALUES (0, 18, 6, 2, 2, 'John'), (1, 19, 6, 3, 2, 'John'), (2, 20, 6, 1, 0, 'John'), (3, 18, 8, 1, 1, 'John') ON DUPLICATE KEY UPDATE     f_key_part = VALUES(f_key_part), f_key_po = VALUES(f_key_po), partQty = VALUES(partQty), r_qty = VALUES(r_qty), r_author = VALUES(r_author);
Query OK, 8 rows affected (0.00 sec)
Records: 4  Duplicates: 4  Warnings: 0

MariaDB [test]> select * from POs_Parts;
+-------+------------+----------+---------+-------+----------+
| p_Key | f_key_part | f_key_po | partQty | r_qty | r_author |
+-------+------------+----------+---------+-------+----------+
|     0 |         18 |        6 |       2 |     2 | John     |
|     1 |         19 |        6 |       3 |     2 | John     |
|     2 |         20 |        6 |       1 |     0 | John     |
|     3 |         18 |        8 |       1 |     1 | John     |
+-------+------------+----------+---------+-------+----------+
4 rows in set (0.00 sec)

缩短语法:

INSERT INTO
    POs_Parts (p_Key, r_qty, r_author)
VALUES
    (0, 2, 'John'),
    (1, 2, 'John'),
    (2, 0, 'John'),
    (3, 1, 'John')
ON DUPLICATE KEY UPDATE
    r_qty = VALUES(r_qty),
    r_author = VALUES(r_author)