【问题标题】:INSERT... NOT EXISTS works on MAMP, but doesn't work on real serverINSERT... NOT EXISTS 适用于 MAMP,但不适用于真实服务器
【发布时间】:2020-06-23 19:06:09
【问题描述】:

我正在尝试将我在 MAMP 服务器上本地开发的网站迁移到实时服务器。 所有查询都按预期在 MAMP 上运行。在实时服务器上,我收到“输入...不存在”的查询错误。

MAMP 服务器: PHP - 7.4.2 MySQL - 5.7.26 InnoDB

实时服务器: PHP - 7.4 MariaDB - 10.2 InnoDB

结构和主键相同 - 检查所有表

$user_id, $id, $date, $summ - 是变量,我通过 POST 方法得到。

查询:

if ($result = $link->prepare("INSERT INTO sb_user_checks (user_id, check_id, date_update, summ, updated_by) 
    SELECT ?, ?, ?, ?, 'You'
    WHERE NOT EXISTS (SELECT date_update FROM sb_user_checks WHERE user_id=? AND check_id=? AND date_update=?)
    ")) { 
        $result->bind_param('iisiiis', $user_id, $id, $date, $summ, $user_id, $id, $date);
        $result->execute();
        if (mysqli_affected_rows($link)>0) {echo 'added';}
        $result->close();
    } 

我收到以下错误:

#1064 - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 3 行的 'WHERE NOT EXISTS (SELECT date_update FROM sb_user_checks WHERE user_i' 附近使用正确的语法 是否与 MySQL 版本有关,还是查询不正确? 但是,它再次在 MAMP 上正常工作。

【问题讨论】:

  • 您遇到什么错误?你应该检查错误。
  • 没有 MySQL 10.2 版本,我猜你的意思是 MariaDB。
  • 我不是 PHP 专家,但我认为您将 'iisiiis' 绑定到要插入到 user_id 的值。这是正确的吗?
  • 我认为SELECT 应该有一个FROM TABLE,这不是你想要的。我会说查询可能是INSERT INTO table (columns) VALUES (placeholder and values) WHERE NOT EXISTS...
  • 在 MySQL 中,我相信 MariaDB,当由于语法原因需要表时,您可以使用 FROM DUAL,但实际上并不相关。 “DUAL”充当单行无列表。

标签: php mysql


【解决方案1】:

在 MySQL 中,我相信 MariaDB,当语法需要但整体逻辑不需要时,查询可以使用DUAL 作为表的替代品。例如,在这种情况下:

SELECT ?, ?, ?, ?, 'You'
FROM DUAL
WHERE NOT EXISTS ...

DUAL 的作用类似于单行无列表;并且实际上只是作为此类场景的替代品。这些因素有很多影响:

  • 不能与 SELECT * 一起使用
  • 不能别名
  • 无法加入。
  • 更多...这些限制只是我在编写此答案时通过手动运行快速测试发现的限制。

【讨论】:

  • 它就像一个魅力!非常感谢!很高兴解决方案如此简单:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 2020-09-03
  • 2012-01-01
  • 1970-01-01
相关资源
最近更新 更多