MySQL auto increment

Материал из PhpWiki.

Перейти к: навигация, поиск

Как сделать, чтобы записи в таблице нумеровались «без пробоев», т.е. первичные ключи шли по порядку 1,2,3,4? Ведь когда я удаляю одну из записей, то получается что-то типа 1,2,4,5, а 3-го нет.

Вам этого не нужно! Но если вам все-таки это очень-очень нужно, то мне придется повторить: вам этого не нужно!

Первичный ключ нужен не для того, что бы по нему можно было строить красивые HTML-таблички c нумерацией и не для сортировки (см. пункт 2).

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

Не убедил? Тогда представьте, что есть прайс-лист. Табличка groups (группы товаров):

+----------------------------+-------------------+
| group_id INT [PRIMARY KEY] | name VARCHAR(255) |
+----------------------------+-------------------+
| .......................... | ................. |
+----------------------------+-------------------+

и табличка goods (товары):

+---------------------------+--------------+-------------------+
| good_id INT [PRIMARY KEY] | group_id INT | name VARCHAR(255) |
+---------------------------+--------------+-------------------+
| ......................... | ............ | ................. |
+---------------------------+--------------+-------------------+

Теперь мы завели товары, группы товаров, все связали между собой с помощью поля group_id в таблице goods и ушли в горы. Но вот кто-то из шефов решил убрать какую-то группу товаров. Вы её убираете, заполняете «дыры» в нумерации таблицы groups, а про то, что надо изменить все соответствующие записи в goods случайно забыли... (я тоже никогда ничего не забываю, но мало ли что бывает :)).

И начинается самое интересное – часть товаров, как всегда, самых важных, куда-то пропадает, часть волшебным образом «переносится» в другие группы. Мониторы продаются в книжном отделе, пиво в компьютерах (это, конечно, не страшно) и так далее. Да, конечно, вы все предусмотрите и ничего не забудете. Но зачем? Для того, чтобы иметь напротив каждой строки порядковый номер? Но нумеровать строки можно и нужно в скриптах. Вот простейший пример:

<?
$i=1;
$result = mysql_query('SELECT * FROM groups');
while($row = mysql_fetch_array($result))
{
echo '<tr><td>'.$i++.'</td>...';
}

Вы не поверите. Эта «задача» действительно решается в полторы строки кода.

Copyright http://phpclub.ru/faq/
Реклама