【问题标题】:convert query from Postresql to Mysql将查询从 Postgresql 转换为 Mysql
【发布时间】:2021-10-30 02:40:08
【问题描述】:

您好,我问了一个关于how to transfer the sql code from Postgresql to Mysql. 的问题 多亏了善意的帮助,我现在可以创建表格了。现在我有以下查询问题,需要再次从 Postgresql 转移到 Mysql。

创建表格

CREATE TABLE public.`user` (
    id varchar(10) NOT NULL,
    chat_id varchar(10) NULL,
    state INT NOT NULL,
    create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (id)
);

我想转移到 mysql 的查询: 插入一行数据后,检查id是否有冲突。如果发生冲突,我们会更新 chat_id 和 state

sql = '''INSERT INTO public.`user`
(id, chat_id, state)
VALUES(%s, %s, 1)
ON CONFLICT(id) DO UPDATE
SET chat_id = EXCLUDED.chat_id, state = EXCLUDED.state;
'''

【问题讨论】:

  • 您总是可以花几分钟时间查看 MySQL 手册。所以在谷歌中快速搜索ON DUPLICATE UPDATE

标签: mysql sql postgresql


【解决方案1】:

PostgreSQL 的 ON CONFLICT 接近 MySQL 的 ON DUPLICATE KEY UPDATE

但是您的查询会执行下一步:如果输入的 id 值在表中不存在,则插入该行,如果存在则保留旧行状态。为了在 MySQL 中做同样的事情,你可以使用更简单的方法

INSERT IGNORE INTO public.`user` (id, chat_id, state)
VALUES(%s, %s, 1);

即如果检测到某些错误(包括重复违规),则只需忽略要插入的值。注意 - 任何错误,不仅是重复违规,都将被忽略。

如果对您不安全,请使用 ODKU:

INSERT IGNORE INTO public.`user` (id, chat_id, state)
VALUES(%s, %s, 1)
ON DUPLICATE KEY UPDATE id=id;

在 MySQL 中的 ODKU 子句中,只有显式更新的列值会被更改(而不是 ON CONFLICT) - 所以id 重新分配给相同的值类似于“忽略新值”。当然你可以使用ON DUPLICATE KEY UPDATE chat_id=chat_id, state=state,没有区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多