Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка вставки записей 
:(
    Опции темы
Geni
Дата 18.8.2010, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 2.4.2008

Репутация: нет
Всего: нет



Работаю в связке PHP + MySQL. Есть написанный мною движок добавления новостей в базу данных. Осуществляется это следующим образом:
Код

 $cat = mysql_query("SELECT id_news, $td FROM `news` WHERE id_news > 1");
 $idt = 0;
 while ( list($id_n,$ch) = mysql_fetch_row($cat) ) {
    if ( $ch == NULL ) {
        $idt = $id_n;
        mysql_query("UPDATE `news` SET $td = '$data' WHERE id_news = $idt");
        break;
    }
 }
 if ( $idt == 0 ) {
    mysql_query("INSERT INTO news (id_news,$td) VALUES (NULL,'$data')");
 }

где
id_news – первичный ключ (1..N)
$td – название поля с хранящейся информацией (в него и осуществляется добавление новостей).
$data – данные для вставки.
Оператор while и внутренняя проверка необходимы для вставки данных после последней записи. Т.е. имеет место быть случай, когда соседний столбец имеет больше записей, чем текущий (в который мы вставляем данные), поэтому необходима использовать именно запрос UPDATE для замены значения NULL на вставляемые данные. Если такого не произошло (текущий столбец имеет больше записей, чем соседний), то выполняется тело оператора условия, идущего после while, а именно запрос INSERT INTO.
Раньше, пока соседний столбец имел больше записей, чем текущий (т.е. выполнялся запрос UPDATE), всё работало отлично. Но после того, как количество записей в текущем столбце превысило количество записей в соседнем начались проблемы.
Например. Мне нужно добавить 5 новостей. Несколько из них (2-3) добавятся правильно (т.е. запрос INSERT INTO отработает как нужно – вставка данных после последней записи в столбце), но следующая добавится между начальными записями таблицы. Т.е. 3 первые новости добавятся с первичными ключами 340, 341, 342 после 339-й записи, а новость с первичным ключом 343 добавиться между 23-й и 24-й. Я не знаю, почему так происходит.
Как это исправить?
Скриншот для наглядности:
user posted image
PM   Вверх
Akina
Дата 19.8.2010, 08:09 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Номер (первичный ключ) присвоен правильно? правильно. Значит, с базой всё в порядке, а проблема в тебе. Точнее, в полном непонимании тобой, что такое реляционные БД.
Пока нет ORDER BY, понятие порядка не существует.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Geni
Дата 19.8.2010, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 2.4.2008

Репутация: нет
Всего: нет



Цитата(Akina @  19.8.2010,  08:09 Найти цитируемый пост)
Пока нет ORDER BY, понятие порядка не существует.

Спасибо. С ORDER BY работает.
По поводу произвольной вставки данных нашёл небольшое обсуждение на ЛОРе. Из прочитанного понял, что обычно данные вставляются по очерёдности их добавления, но есть случаи подобные моему – когда данные вставляются произвольно. Есть вопрос: можно ли каким-нибудь образом всё-таки вставлять данные по очерёдности их добавления?
PM   Вверх
Akina
Дата 19.8.2010, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(Geni @  19.8.2010,  12:05 Найти цитируемый пост)
Из прочитанного понял, что обычно данные вставляются по очерёдности их добавления

Бред. Даже не читая - если из него можно сделать ТАКОЙ вывод.

Данные физически вставляются в таблицу так, как сервер БД сочтёт нужным. Исключение - наличие кластерного индекса, тогда физически данные вставляются в порядке следования этого индекса.

Однако повторю: в реляционных БД без указания порядка сортировки не определено понятие порядка записей. В частности это одначает, что два выполнения одного и того же запроса, не содержащего ORDER BY, могут вернуть одни и те же записи в РАЗНОМ порядке.

Так что не воюй с ветряными мельницами. Учи матчасть и указывай сортировку ЯВНО.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0817 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.