![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Kremnik |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 5.9.2008 Репутация: нет Всего: нет |
Проблема такая:
Есть поле id, стоящее с auto_increment. Например:
Но если я удаляю запись с, например, id=2
а потом вставляю новую запись, то она вставляется не в конец, как должна, а на место удалённой записи, т.е.:
В чём может быть проблема и как её решить? |
||||||
|
|||||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
У таблицы есть параметр - AUTO_INCREMENТ.
Его можно установить при создании таблицы и установить запросом
Судя по всему, при создании таблицы он не был установлен, вот и выбирался первый попавшийся в "дырку" параметр. Это сообщение отредактировал(а) ksnk - 28.3.2009, 00:36 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 9 Всего: 315 |
да нет, он же говорит, что авто_инкремент есть, просто запись с id=101 становится на место удалённой. но для упорядоченной выборки существует сортировка, т.е. достаточно выбирать
а какое положение занимает физически строчка в БД роли не играет |
|||
|
||||
| Kremnik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 5.9.2008 Репутация: нет Всего: нет |
В смысле не играет? Если у меня например таблица комментариев, и надо выбрать 10 последних. Перед этим последний комментарий встал на место удалённого под номером 2. Т.е. надо всегда сортировать получаеся?
|
|||
|
||||
| ksnk |
|
||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
bars80080, у ТАБЛИЦЫ есть такой параметр. У таблицы может быть только одно автоинкрементное поле, так что параметр принадлежит именно таблице. Он задается при создании таблицы
либо его можно поменять, в том числе и при существующем поле.
Следующая вставленная запись будет с `id` 4665 Это сообщение отредактировал(а) ksnk - 28.3.2009, 01:04 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
||||
|
|||||
| StachelDraht |
|
|||
![]() Не Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 19.1.2006 Репутация: нет Всего: 1 |
может дело в первичном ключе?
|
|||
|
||||
| Kremnik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 5.9.2008 Репутация: нет Всего: нет |
Нет, точно не первичный ключ, уже пробовал.
Что то я не понял про установление ai на отдельное поле таблицы...т.е. надо сначала создать поле, а потом уже к нему отдельно ai добавлять? Если так, то уже пробовал, не получается. Но не сортировать же каждый раз перед запросом... |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
O! Чего-то в той документации криво написано... :-(
Вот так - заработало...
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Kremnik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 5.9.2008 Репутация: нет Всего: нет |
Извините, но что значит
? |
|||
|
||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 4 Всего: 73 |
Это значит, что следующее значение поля auto_inrement будет "номер+1". -------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
| Kremnik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 5.9.2008 Репутация: нет Всего: нет |
Ок, спасибо. Но всё же, это же, получается, никак не автоматизировать. Т.е. так и так при удалении записи, а потом при вставке новой записи она будет вставать на место удалённой. Т.е. единственный способ нормально сортировать записи по ai-полю - каждый раз перед основным запросом отправлять запрос на сортировку по ai-полю. Только проблема в том, что у меня в базе, например, ~3000 записей. Тяжеловато каналу пользователя будет
|
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 9 Всего: 315 |
в смысле? причём здесь канал? написал один запрос, а они в БД сами отсортируются и выйдут одной выборкой. тут хоть миллион записей |
|||
|
||||
| Kremnik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 5.9.2008 Репутация: нет Всего: нет |
Представим действия пользователя:
1) Заходит на страницу статьи 2) Смотрит к ней комментарии 3) Пишет свой 4) После него другой пользователь добавляет ещё один комментарий 5) Первый пользователь удаляет свой комментарий и пишет новый 6) Комментарий встаёт не на последнее место, а на место его предыдущего комментария 7) Вывод комментариев и пользователь замечает, что его комментарий встал не последним В этой время действия сервера: 1) Выборка статьи 2) SELECT * FROM comments ORDER BY id 3) Вставка записи в таблицу с комментариями (INSERT INTO comments (1,2,3) VALUES (a,b,c) 4) Вставка другого комментария другим пользователем (INSERT...) 5) DROP...; INSERT... 6-7) SELECT * FROM comments ORDER BY id А вы предлагаете перед скриптом в начале скрипта сделать выборку всех комментариев и отсортировать их по id и при этом сделать это незаметно (в смысле скорости загрузки страницы) для пользователя. А теперь представим, что у меня 100000 комментариев. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
Kremnik, Сейчас база "неправильная". Ее можно исправить, если сделать в PHPMyAdmin'е, во вкладке "SQL" вот такое
Общий смысл - ищем максимальное значение поля `id` и устанавливаем параметр автоинкремента в этой таблице в нужное значение. После этого все новые записи будут начинаться с индексов, которые еще не встречались в базе. Независимо от того, удалял юзер записи или нет. Возможно я перемудрил с SQL'ем, выглядит несколько гемороисто, но подставить в запрос значение переменной у меня не получилось. Во всяком случае - так работает -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| IZ@TOP |
|
||||||||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 4 Всего: 73 |
О_о это как такое может быть? Волшебство? *спустя некоторое время дошло* попробуйте пересоздать таблицу используя приведенный ниже DDL напрямую через консоль. Не помню из-за чего такое бывает, возможно из-за указания специфичных свойств ключей. о_О а зачем это надо? Извращенцы *нервно поглядывает в сторону постера* Может, конечно, я не в теме, но самая простая таблица коментов и выборки из нее выглядят примерно так:
user_id - идентификатор запостившего коммент. post_id - комментируемый объект (пост в блоге, например). Ключ sort, для выборки по post_id и сортировке по полю date. Если хотите сортировать по ID, просто измените DDL. Ключ двойной создан для того, чтобы для сортировки использовался индекс. Как выбрать записи и отсортировать
EXPLAIN этого запроса будет примерно таким:
Если у вас есть необходимость удалять комментарии по полю user_id, создайте для этого соответствующий индекс. Примечание. Если не использовать LIMIT, filesort будет использоваться.
-------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
||||||||
|
|||||||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Базы Данных | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |