【问题标题】:MySQL - insert into... on duplicate key update - How to distinguish between insert or update?MySQL - 在重复键更新时插入... - 如何区分插入或更新?
【发布时间】:2019-08-12 08:33:39
【问题描述】:

我正在使用 Node.js。我使用mysqlbluebird 包。

const pool = mysql.createPool({ ... });

const query = (stmt, params) => {
    return Promise.promisify(pool.query, { context: pool })(stmt, params);
};

const params = { ... };

const stmt = 'insert into table set ? on duplicate key update ?';

return query(stmt, [params, params])
    .then(results => {
        // I want to know actually what is done, insert or update
    });

【问题讨论】:

    标签: mysql node.js node-mysql


    【解决方案1】:

    返回对象应该有一个键affectedRows。从参考资料来看,affectedRows 插入时为 1,更新时为 0 或 2。

    return query(stmt, [params, params])
        .then(results => {
            // I want to know actually what is done, insert or update
            if (results.affectedRows === 1) {
                // inserted
            } else {
                // updated
            }
        });
    

    对于 INSERT ... ON DUPLICATE KEY UPDATE 语句,如果将行作为新行插入,则每行的受影响行值为 1,如果更新现有行,则为 2,如果将现有行设置为,则为 0它的当前值。如果您指定 CLIENT_FOUND_ROWS 标志,如果现有行设置为其当前值,则受影响的行值为 1(而不是 0)。

    参考:https://dev.mysql.com/doc/refman/8.0/en/mysql-affected-rows.html

    【讨论】:

    • 非常感谢! FOUND_ROWS 默认为开启。我把它关了,你的回答很完美!
    【解决方案2】:

    虽然我对这一点 node api 不太了解,但基本原理是一样的:

    query(stmt, [params.col1, params.col2])
    .then(results => {
        Console.log("Affected rows: " + results.affectedRows);
    });
    

    现在,真正的问题是 MySQL 热衷于返回垃圾诊断信息。如果您修改超过 1 行,您将不知道每一行发生了什么,thanks to this

    使用 ON DUPLICATE KEY UPDATE,如果将行作为新行插入,则受影响的行值 每行 为 1,如果现有行被更新,则为 2,如果现有行被更新,则为 0设置为其当前值。

    如果您负担得起,请一次执行这些语句,并检查受影响的行数。否则,我正在挖掘一些 MySQL 内部函数,但看不到太多。

    作为旁注,您在此处使用通配符超出了范围。相反,使用该空间来更新/插入您想要的列,并参数化输入值:

    -- Please don't name it 'table'
    INSERT INTO my_table (column1, column2)
        VALUES (?, ?)
    ON DUPLICATE KEY UPDATE column1 = VALUES(column1), column2 = VALUES(column2)
    

    【讨论】:

      猜你喜欢
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多