Поле автоинкремента и декремента доступно в базе данных sqlite? - PullRequest
1 голос
/ 15 июня 2011

Я получаю свои данные с идентификатором, который является первичным ключом Integer или целым числом.

Но после удаления любой строки ...

После этого, если мы сделаем запрос select, чтобы показать все.

Но это даст принудительное закрытие, потому что отсутствует один идентификатор.

Я хочу, чтобы этот идентификатор сам мог занять auto increment & decrement.

, когда я удаляю запись вконец (ig id = 7), после этого я добавляю строку, тогда id должен быть 7, а не 8. как и при удалении строки посередине (ig id = 3), тогда все строки автоматически указываются путем присоединения.

ваша идея может помочь мне.

1 Ответ

0 голосов
/ 15 июня 2011

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

Судя по тому, что вы спрашиваете, SQLite является еще одной такой системой.

Если в системе есть какой-либо параллелизм, то это рискованно, но для однопользовательской системы, работающей с одним приложением, вам может не понравиться:

SELECT MAX(id_column) + 1 FROM YourTable

, чтобы найти следующее доступное значение. В зависимости от поведения SQLite вы можете включить его в список VALUES оператора INSERT:

INSERT INTO YourTable(id_column, ...)
    VALUES((SELECT MAX(id_column) + 1 FROM YourTable), ...);

Это может не сработать; Возможно, вам придется сделать это как две операции. Обратите внимание, что если есть какой-либо параллелизм, форма двух операторов является плохой идеей TM . Ограничение уникальности первичного ключа обычно предотвращает аварийное завершение, но одно из двух одновременных операторов не выполняется, потому что оно пытается вставить значение, которое только что вставлено другим - поэтому оно должно повторить попытку и надеяться на лучшее. Очевидно, что сотовый телефон имеет меньше параллелизма, чем, скажем, веб-сервер, поэтому проблема, соответственно, менее серьезна. Но будь осторожен.

В целом, лучше всего, чтобы в последовательности появлялись пропуски, не беспокоясь об этом. Обычно нет необходимости беспокоиться о них. Если вам нужно беспокоиться о пробелах, не позволяйте людям делать их в первую очередь. Или переместите существующую строку, чтобы заполнить пробел, когда вы делаете удаление, которое его создает. Это по-прежнему оставляет удаления в конце, создавая пробелы при добавлении новых строк, поэтому лучше всего преодолеть менталитет «это должна быть непрерывная последовательность чисел». Автоинкремент гарантирует уникальность; это не гарантирует смежности.

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