Как получить вставленные идентификаторы нескольких строк на одной вставке? - PullRequest
0 голосов
/ 30 апреля 2018

Я хочу вставить несколько строк в таблицу, используя один оператор INSERT. Это не проблема, поскольку SQL предлагает возможность предоставить несколько строк в качестве параметра для одного оператора INSERT. Теперь эти строки содержат поле ID, которое увеличивается автоматически, т.е. его значение задается базой данных, а не моим кодом.

В результате я хотел бы получить значения ID вставленных строк. Мой основной вопрос: как мне это сделать для MariaDB / MySQL?

Как оказалось, это довольно просто, например в PostgreSQL, поскольку PostgreSQL имеет предложение RETURNING для INSERT, которое возвращает требуемые значения для одной или даже для нескольких строк. Это именно то, что я хочу, и это работает.

К сожалению, ни в MariaDB, ни в MySQL нет предложения PostgreSQL RETURNING, поэтому мне нужно вернуться к чему-то, например LAST_INSERT_ID(), но это возвращает только ID одной последней вставленной строки, даже если было вставлено несколько строк используя один INSERT. Как получить все значения ID?

Мой код в настоящее время выглядит так:

INSERT INTO mytable
  (foo, bar)
VALUES
  ('fooA', 'barA'),
  ('fooB', 'barB');

SELECT LAST_INSERT_ID() AS id;

Как я могу решить эту проблему так, чтобы она работала даже при одновременной записи?

(И нет, нельзя изменить поле UUID или что-то подобное; поле автоинкремента задано, и его нельзя изменить.)

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

MySQL & MariaDB имеют функцию LAST_INSERT_ID(), и она возвращает идентификатор, сгенерированный самой последней инструкцией INSERT в вашем текущем сеансе.

Но когда ваш оператор INSERT вставляет несколько строк, LAST_INSERT_ID() возвращает первый идентификатор в сгенерированном наборе.

В такой партии из нескольких строк вы можете рассчитывать на то, что последующий идентификатор является последовательным. Например, от этого зависит драйвер JDBC MySQL.

Если строки, которые вы вставляете, включают в себя сочетание значений NULL и не NULL для столбца id, вы рискуете ошибиться с этим предположением. Драйвер JDBC возвращает неправильные значения для набора сгенерированных идентификаторов.

0 голосов
/ 30 апреля 2018

Как указано в комментариях, вы можете захватить вставленные идентификаторы (SQL Server):

use tempdb

create table test (
    id int identity(1,1) primary key,
    t varchar(10) null
)

create table ids (
    i int not null
)

insert  test(t)
output  inserted.id into ids
values (null), (null), (null)


select  *
from    test

select  *
from    ids
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...