Будет ли вставка нескольких строк в один запрос INSERT гарантировать последовательные первичные ключи с автоинкрементом? - PullRequest
1 голос
/ 20 марта 2020

Допустим, у меня есть эта простая таблица:

CREATE TABLE some_table (
  id INT(11) PRIMARY KEY AUTOINCREMENT,
  name VARCHAR(20)
);

с этим оператором INSERT:

INSERT INTO some_table (name) VALUES ("Foo"), ("Bar"), ("Buz");

Результат дает мне (например):

fieldCount = 0
affectedRows = 3
insertId = 18
info = 'Records: 3  Duplicates: 0  Warnings: 0',
serverStatus = 2
warningStatus = 0

После выполнения оператора SELECT я вижу, что первая вставленная строка имеет insertId = 18; гарантируется ли, что последующий вставленный документ имеет свой идентификатор в последовательности?

Другими словами, гарантируется ли, что последующий SELECT выдаст следующие строки?

SELECT * FROM some_table WHERE id >= 18 LIMIT 3

id    | name
------+--------------
18    | Foo
19    | Bar
20    | Buz

И если этот результат не гарантируется, гарантирует ли транзакция это тогда?

И если транзакция не гарантирует этого, возможно ли получить отдельные значения идентификатора в последовательности?

1 Ответ

1 голос
/ 20 марта 2020

... будет ли один запрос гарантировать последовательные первичные ключи с автоинкрементом?

Нет.

Механизм базы данных обеспечит - однако - они ДРУГОЙ. Почему вы хотите, чтобы они были последовательными, в первую очередь?

Первичные ключи не должны выглядеть сексуально или красиво. Первичные ключи - это технический уровень уникальные идентификаторы строк, обычно скрытые от пользователей. Они не должны отображаться в пользовательском интерфейсе или показываться конечному пользователю в каких-либо отчетах.

Если вам нужны последовательные номера, это означает, что вы, вероятно, захотите их где-нибудь раскрыть. Не используйте первичный ключ для этого. Возможно, вам следует создать дополнительный столбец UNIQUE для этой конкретной цели c, с хорошим форматированием, симпатичной нумерацией и т. Д.

...