Продублировать значение первичного ключа

no_santa

Снегур
Продублировать значение первичного ключа

Коллеги, простите за возможно тривиальный вопрос...

В таблице, кроме первичного ключа, есть целочисленное поле, которое на этапе внесении записи дублирует значение первичного ключа. Буквально это sort order, то есть ключ для последующей ручной сортировки.

Сейчас делаю это двумя запросами - сперва вношу запись, а потом сразу правлю ее, копируя id в sortorder. Можно-ли это сделать одним запросом? Или просто как-то более удачно?
 

no_santa

Снегур
Автор оригинала: prolis
может ну его, второй апдейт:
[sql]
sort by ifnull(sortfield,id)
[/sql]
То есть вносить данные во второй столбец только при изменениях? Конечно интересно... А это быстро, корректно?
 

prolis

Новичок
Автор оригинала: no_santa
То есть вносить данные во второй столбец только при изменениях? Конечно интересно... А это быстро, корректно?
Быстрота зависит от необходимости использования индекса при сортировке результата.
 

no_santa

Снегур
Сортировка происходит постоянно, и индекс используется. Это достаточно частый случай, к примеру, каталог товаров магазина, рубрикатор статей или записи в онлайн-органайзере. Подозреваю, что решение вопроса тривиальное, но два запроса при вставке данных действительно напрягают.
 

prolis

Новичок
Я имел в виду необходимость использования именно индекса для сортировки.
Например в результате фильтра условий у тебя в результирующей выборке осталось 50 записей для отображения, которые и надо отсортировать. В таком случае индексом для сотрировки можно пернебречь.
А вот для простого топ-50 по полю из многих тысяч - тогда да, индекс необходим.
 

KolyaA

Новичок
Re: Продублировать значение первичного ключа

Автор оригинала: no_santa
Коллеги, простите за возможно тривиальный вопрос...

В таблице, кроме первичного ключа, есть целочисленное поле, которое на этапе внесении записи дублирует значение первичного ключа. Буквально это sort order, то есть ключ для последующей ручной сортировки.

Сейчас делаю это двумя запросами - сперва вношу запись, а потом сразу правлю ее, копируя id в sortorder. Можно-ли это сделать одним запросом? Или просто как-то более удачно?
Почитай вот это:

http://sql.ru/forum/actualthread.aspx?bid=6&tid=490892&pg=1
 

no_santa

Снегур
KolyaA Спасибо.


Оставил старое решение, как наиболее оптимальное. Почему:
- чтение безусловно происходит намного чаще записи. В начальном варианте скорость чтения на высоте, а запись - всего-лишь в два раза дольше, что по сути не принципиально.
- любые финты с дополнительным чтением или триггерами включают UPDATE, поэтому в принципе дольше одинокого UPDATE.

-~{}~ 18.08.10 20:30:

Итого

UPDATE table SET 'sotrorder' = '.$id.' WHERE id='.$id.' LIMIT 1;

в слое
$this->db->insert($table);
$id = $this->db->insert_id();
$this->db->set('sortorder',$id)->where('id',$id)->update($table);
return $id;
 
Сверху