Идентификаторы таблицы в моей базе данных sqlite были сброшены - PullRequest
1 голос
/ 02 сентября 2010

У меня есть приложение для iPhone, и один из моих пользователей обнаружил странную проблему с моим приложением.Я не могу воспроизвести проблему и не могу понять, почему это происходит.Может быть, вы можете?

В Sqlite у меня есть таблица с около 1000 строк, каждая с уникальным идентификатором.Но по какой-то причине идентификатор этой таблицы перезапустился, раньше он был около 1000, но теперь он перезапускается с 80 кое-чего.Поэтому каждый раз, когда пользователь вставляет новую строку, новый назначенный идентификатор начинается примерно с 80, и я получаю два дубликата идентификаторов, которые должны быть уникальными, и да, вы можете понять проблему.Я посмотрел на все запросы, которые что-то делают с этой таблицей, и ни один из них не мог этого сделать.Я всегда ретранслирую на встроенный механизм, где идентификаторы назначаются автоматически.

Вы видели что-нибудь подобное?

Схема таблицы выглядит следующим образом:

CREATE TABLE mytable(
  id INTEGER PRIMARY KEY
);

Как видите, я не использую AUTOINCREMENT.Но из того, что я понимаю, даже если пользователь удаляет строку с идентификатором 80, можно дать новый вставленный идентификатор строки 80, но не так, как это работает сейчас, когда база данных просто увеличивает идентификаторы, даже если у меня уже есть строки стот же идентификаторРазве это не должно работать так:

HIGHEST ROWID IS 1000, ALL IDS FROM 0-1000 ARE TAKEN
USER DELETES ROW WITH ID 80
INSERT A NEW ROW
    THE ID OF THE INSERTED ROW MIGHT NOW BE 80
    SETS THE ID OF THE INSERTED ROW TO 80
INSERT A NEW ROW
    THE ID OF THE INSERTED ROW CAN NOT BE 81 AS THIS IS ALREADY TAKEN
    SETS THE ID OF THE INSERTED ROW TO 1001

Разве не так это должно работать?

Ответы [ 2 ]

1 голос
/ 02 сентября 2010

Вы объявили свой столбец идентификатора как (n автоинкрементный) первичный ключ?

CREATE TABLE mytable(
  id INTEGER PRIMARY KEY AUTOINCREMENT
);

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

Редактировать Это довольно далеко, но sqlite поддерживает только один первичный ключ на таблицу.Если у вас объявлено более одного первичного ключа, вам нужно объявить все, кроме того, который вы фактически хотите использовать в качестве первичного ключа, как «уникальный».Отсюда

CREATE TABLE mytable(
  id INTEGER PRIMARY KEY, 
  otherId INTEGER UNIQUE
);
0 голосов
/ 02 сентября 2010

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

Как убедиться, что (в теории) идентификаторы уникальны? Каков ваш запрос на вставку?

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