Многое из вышеперечисленного основано на этом

ел бы предсказать (действительно, обратный инжиниринг) rowid любой строки, которая должна быть вставлена ​​в таблицу sqlite (чтобы восстановить поток вставок sqlite, используя rowid некоторых таблиц в качестве внешнего ключа в других таблицах). Вставка может произойти после произвольной последовательности вставок и удалений. Как rowid определяется sqlite при вставке?

Это когда-либо увеличивающийся счетчик?

int64_t next_rowid() {
  static int64_t r = 0;
  return ++r;
}

Может быть, самый маленький ряд не используется?

// Algorithm description, not (likely) working code
static sorted_set<int64_t> deleted;
static int64_t top = 0;
int64_t next_rowid() {
  if(deleted.size()==0) deleted.push(++top);
  return deleted.pop_front();
}
void delete_rowid(int64_t r) {
  deleted.push(r);
}

Какая-то другая схема?

Неопределенные?

Ответы на вопрос(2)

есть 2 типа алгоритмов определения rowid. В зависимости от того,AUTOINCREMENT был указан.

AUTOINCREMENT означает, что rowid гарантированно увеличится в пределах ограничений размера числа (9223372036854775807). Если это число достигнуто, то любая последующая попытка вставки завершается неудачей с исключением SQLITE_FULL.

БезAUTOINCREMENT в приведенном выше сценарии алгоритм попытается найти неиспользуемый rowid, и, следовательно, результирующий rowid может быть ниже, чем другие существующие rowid.

Ни один из алгоритмов не гарантирует увеличение на 1, скорее всего, они будут увеличиваться на 1.

AUTOINCREMENT результаты в таблицеsqlite_sequence создается последний использованный rowid в столбце последовательности. ею можно манипулировать / изменять, поэтому добавьте 1 запись, затем измените ее на 100, и следующая вставка, вероятно, будет 101.

Столбец имени - это имя таблицы, для которой предназначена строка.

В качестве теста я изменил столбец имени на несуществующее имя таблицы (последняя последовательность была 101), вставив запись, которая по-прежнему приводила к 102, поэтому может показаться, что при отсутствии соответствующей последовательности в sqlite_sequence алгоритм все еще находит более высокий шум

Затем я уменьшил последовательность до 2, следующий rowid был 103.

Таким образом, гарантия более высокого Ridid кажется тщательной.

Затем я добавил 2-ую строку в sqlite_sequence для той же таблицы с порядковым номером 600. В результате операции вставки был указан идентификатор строки 104.

Поскольку SQLite, возможно, выбирает первую строку в соответствии с идентификатором, я затем изменил идентификатор с 2 (1 - это тот, который был изменен на несуществующее имя таблицы) на 20. 3 - это идентификатор строки строки входа в руж / 2-ю. Добавленный rowid был 601.

Чтобы попытаться обмануть SQLite, я удалил только что добавленную строку в таблице и строку с rowid 3, значение последовательности 601 в таблице sqlite_sequence. SQLite был одурачен, rowid вставленной строки был 105.

Таким образом, алгоритмы выглядят так:

а) гдеAUTOINCREMENT не указано

1 больше самого высокого rowid в таблице, в которую вставляется строка, если только оно не больше, чем 9223372036854775807, и в этом случае будет использоваться неиспользуемый rowid.

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

Многое из вышеперечисленного основано на этом

Решение Вопроса

https://sqlite.org/autoinc.html -

SQLite является однопоточным, поэтому в большинстве случаев он выполняетselect max(id) +1 from the_table, С этой точки зрения действительно трудно сказать, какова была последовательность. Тем не менее, вы можете указать действительную последовательность, которая относится к удаленным материалам, поскольку они отсутствуют. Или, может быть, я что-то пропустил.

редактировать

Как CL заметил.Autoincrement работает более стабильно. Таким образом, вы не можете получить один и тот же идентификатор дважды. И из этого вы можете видеть, что что-то было удалено между тем ...

 CL.21 дек. 2017 г., 23:20
С AUTOINCREMENT SQLite использует другой алгоритм.
 Andreas22 дек. 2017 г., 21:50
«Тем не менее, вы можете предоставить действительную последовательность, угрожающую удаленному материалу, как отсутствующую» - я понимаю, что могу реализовать предпочтительную последовательность, действуя как любой из алгоритмов, упомянутых в моем посте, явно установив rowid в моих вставках. Facepalm. И хорошо.

Ваш ответ на вопрос