NodeJs & MySql:当 table id 是 UUID 时,results.insertId 始终为 0

NodeJs & MySql: results.insertId always 0 when the table id is a UUID

我正在使用 NodeJs mysql 包将记录插入到 MySql table,然后尝试通过请求获取插入的记录 id results.insertId。但是,尽管正确插入了记录,但返回的 id 始终为零。

问题可能是 table 的 Primary KeyUUID (BINARY 16)。如果我将其更改为 INT (11) insertId returns 正确的值。那么有办法解决吗?如果 UUID 我可以得到 insertId 吗?

这是我的代码:

pool.query('insert into my_table (id, title) '
                    + ' values(uuid(), ?', [ title ],
  function (error, results, fields) {
    if (error) {
      console.log(error);
      reject(error);
    } else {
      resolve(results);
    }
 }

完整的 results 对象:

OkPacket {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 0,
  serverStatus: 2,
  warningCount: 0,
  message: '',
  protocol41: true,
  changedRows: 0 }

您的 ID 列不是 AUTO_INCREMENT 列。这就是为什么你不能使用 insertId

您可以考虑在代码上生成 uuid 并将其作为参数插入到您的查询中。

或执行 2 个单独的查询:

SELECT UUID()
INSERT INTO my_table (id, title) VALUES ($uuid, ?)

您正在检查的 insertId 值仅在 auto_increment 键(必须是整数,而不是 UUID)的情况下才会填充。在这种情况下,键直接由插入查询生成,并且可以作为最后插入的 id 读取。 在您的情况下,UUID 是由插入查询生成的注释,而不是由 uuid() 函数生成。

您可以通过两种方式解决此问题:

  • 您可以在 nodejs 中显式生成 uuid 并在插入查询中使用该值
  • 您可以创建一个存储过程来生成 uuid、保存记录和 returns uuid。