Xpoint
   [напомнить пароль]

Переиндексация некоторых числовых полей в SQLite

Метки: [без меток]
2005-06-28 20:42:45 [обр] Kondor(0/5)[досье]
Пишу гостевую книгу: PHP4 + SQLite. В таблице есть поле, описанное как "msg_no INTEGER PRIMARY KEY", которое каждый раз увеличивается и этот номер сообщения выводится пользователю. Есть к гостевой книге и панель администратора, в которой можно удалять сообщения, после удаления номера сообщений не реиндексируются, т.е., например, удалили сообщение #2, а в HTML вставляется: "Сообщение №1", "Сообщение №3". Интересует, есть ли какие-нибудь внутренние средства SQLite переиндексировать эти номера по-порядку (в документации SQLite подобного мне найти не удалось)? Спасибо.
спустя 28 минут [обр] Алексей В. Иванов(2/2861)[досье]
Вроде, как и не должно быть. Можете MAX использовать вместо AUTO_INCREMENT, но это ненадежно.
спустя 1 час 40 минут [обр] Kondor(0/5)[досье]

> Вроде, как и не должно быть. Можете MAX использовать вместо AUTO_INCREMENT, но это ненадежно.

 Просто если в БД будет много записей и в цикле делать переиндексацию с помощью Update, то я считаю, что будет много ресурсов тратиться и "тормозить"

спустя 11 часов [обр] Алексей Полушин(9/231)[досье]
Kondor[досье] А вы не используйте PRIMARY KEY в качестве порядкового номера сообщения, неправильно это. PRIMARY KEY - это уникальный идентификатор записи, не должен он меняться.
спустя 6 дней [обр] Dag+(0/43)[досье]

В данном примере нет разницы существует ли кроме msg_no еще один ключ или нет (auto_increment будет только один из них): дело в тем что его значение принципиально нельзя менять (как принцип стратегии) и все тут. msg_no можно понимать как msg_id те. как уникальный идентификатор записи (другого применения я не вижу). А так (если где ни будь это понадобиться), у Вас 2 варианта симуляции reset auto_increment field (так как по дефиниции это невозможно):

  1. Если, допустим у Вас msg_id=1,2,3,4,5 и Вы сотрете № 5 тогда
ALTER TABLE tbl_name AUTO_INCREMENT=5
  1. Универсальное решение (и только тепер Вы поймете чего, на самом деле добываетесь):
ALTER TABLE tbl_name DROP COLUMN msg_id;
ALTER TABLE tbl_name ADD COLUMN msg_id Int Unsigned Primary Key Auto_Increment;

Можно в конце добавыт (first). Все это в mysql. Думаю что будет работать и в SQLite. Примерно тоже самое делает MS Access после запуска Database Utilities / Compact Database. Но все это так редко имеет оправдание...

спустя 1 день 14 часов [обр] Закиров Руслан(12/343)[досье]
Dag[досье] А что делать со ссылочной целостностью данных?
спустя 9 часов [обр] Dag+(0/43)[досье]
Руслан: и я именно об этом.
Powered by POEM™ Engine Copyright © 2002-2005