NodeJs & MySql: results.insertId всегда 0, когда идентификатор таблицы является UUID - PullRequest
0 голосов
/ 21 января 2019

Я вставляю записи в таблицу MySql, используя пакет NodeJs mysql, затем пытаюсь получить вставленную запись id, запрашивая results.insertId.Но хотя запись вставлена ​​правильно, возвращаемый идентификатор всегда равен нулю.

Возможно, проблема в том, что в таблице Primary Key - UUID (BINARY 16).Если я изменю его на INT (11), insertId вернет правильное значение.Так есть ли способ обойти это?Могу ли я получить insertId, если это UUID?

Это мой код:

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 }

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Проверяемое вами значение insertId заполняется только в случае ключа auto_increment (который должен быть целым числом, а не UUID). В этом случае ключ генерируется непосредственно запросом вставки и доступен для чтения как последний вставленный идентификатор. В вашем случае UUID - это примечание, сгенерированное запросом вставки, вместо этого оно генерируется функцией uuid().

Вы можете обойти эту проблему двумя способами:

  • Вы можете явно сгенерировать uuid в nodejs и использовать это значение в запросе вставки
  • Вы можете создать хранимую процедуру, которая генерирует uuid, сохраняет запись и возвращает uuid.
0 голосов
/ 21 января 2019

Ваш идентификатор не является столбцом AUTO_INCREMENT. Вот почему вы не можете использовать insertId

Вы можете сгенерировать uuid для кода и вставить его в качестве параметра в свой запрос.

или выполнить 2 отдельных запроса:

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