mysql - 准备好的语句 : Duplicate Key Update with Where

标签 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 = ?

如何将这两个查询合并为一个,就像我以前尝试过的那样?

最佳答案

我只在 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

关于mysql - 准备好的语句 : Duplicate Key Update with Where,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32210052/

相关文章:

php - mysql_real_escape_string 适用于本地主机但不适用于网络服务器

mysql - 获取Postgresql中某个列值仅存在于特定组中的记录

sql - 如何将两个相同的数据库数据合并为一个?

php - 如何处理 PHP 中 FluentPDO 的安全问题?

java - 在 JOOQ 中动态构建条件

mysql - SQL : Alias in FROM subquery MySQL doesn't work

sql - 在调试期间观察 SSIS 中的变量

MySQLdb._exceptions.ProgrammingError : (1064,“您的 SQL 语法有错误)

使用 2 个内连接时 MySQL 查询未返回预期行数

mysql - 优化Innodb表以释放可用空间