【问题标题】:MariaDB having syntax in a new MariaDB installMariaDB 在新的 MariaDB 安装中具有语法
【发布时间】:2020-03-10 17:18:20
【问题描述】:

我开发了一些 Python 脚本,它们使用 PyMySQL 库将数据插入 MariaDB 数据库。

直到昨天,脚本都运行良好。昨天服务器的硬盘坏了。我刚刚安装了 3 个磁盘(1 个用于引导和 SWAP,另外两个在带有 EXT4 和 / 安装点的 raid 1 中)。当主包准备好后,我发现脚本由于下一个查询而无法正常工作

INSERT
INTO
    devices(
        source_id,
        serialnumber,
        NAME,
        location_desc
    )
SELECT
    2,
    '5996B',
    'Barbate',
    'CADIZ'
WHERE NOT EXISTS
    (
    SELECT
        1
    FROM
        devices
    WHERE
        serialnumber = '5996B'
)

如果设备不存在,此查询将设备插入到设备表中。这些脚本在我的本地 MariaDB 服务器中运行良好,但在生产服务器中运行良好,出现下一个错误:

Error

SQL query: Documentation

INSERT
INTO
    devices(
        source_id,
        serialnumber,
        NAME,
        location_desc
    )
SELECT
    2,
    '5996B',
    'Barbate',
    'CADIZ'
WHERE NOT EXISTS
    (
    SELECT
        1
    FROM
        devices
    WHERE
        serialnumber = '5996B'
)

MariaDB said: Documentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'WHERE NOT EXISTS
    (
    SELECT
        1
    FROM
        devices
    W' at line 14

我认为这是与较新版本的 MariaDB 的兼容性问题。如何在不重写 Python 脚本的情况下修复它?

编辑:

结果: SELECT VERSION();

本地服务器中的响应(SQL 语句工作的地方): 10.4.6-MariaDB

生产服务器中的响应(SQL 语句不起作用): 10.3.17-MariaDB-0+deb10u1

【问题讨论】:

  • 你的FROM呢??? SELECT WHERE NOT EXIST()SELECT来自哪里?
  • @Eric 该查询在开发 mysql 服务器中有效
  • 此语句中没有任何内容会导致向后兼容性问题。所以也许你的 python 脚本没有正确构建它。
  • 是的。您需要检查 python ..(顺便说一句,将东西推广到不同于开发/测试/登台的生产环境不是一个好主意,或者冒着这种事情咬你的风险)。
  • 我编辑了你的标签和问题。您使用的不是 MySQL,而是 MariaDB。 MariaDB 在 2010 年从 MySQL 分叉出来,并且逐渐变得越来越不兼容。你不应该再认为 MariaDB 与 MySQL 兼容。

标签: sql mariadb pymysql


【解决方案1】:

我找到了解决办法:

FROM DUAL 在某些 mysql-server 版本中是必需的,因此要使其正常工作,需要将查询更改为:

INSERT
INTO
    devices(
        source_id,
        serialnumber,
        NAME,
        location_desc
    )
SELECT
    2,
    '5996B',
    'Barbate',
    'CADIZ'
FROM DUAL
WHERE NOT EXISTS
    (
    SELECT
        1
    FROM
        devices
    WHERE
        serialnumber = '5996B'
)

我希望有人觉得这很有用

【讨论】:

    猜你喜欢
    • 2020-03-19
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多