Конечно, самый простой ответ - использовать ORDER BY
при запросе вашей таблицы, а затем вы можете контролировать порядок строк в наборе результатов запроса. Но я предполагаю, что вы хотите, чтобы «естественный» порядок строк был в числовом порядке, когда вы не используете ORDER BY
.
Если ваша таблица использует механизм хранения InnoDB, порядок по умолчанию при запросе без использования ORDER BY
всегда является порядком первичного ключа. Это потому, что InnoDB хранит таблицы как кластерный индекс по первичному ключу. Поэтому, если ID является вашим основным ключом, и вы конвертируете свою таблицу в InnoDB, тогда вы можете положиться на ее естественный порядок.
mysql> ALTER TABLE MyTable ENGINE=InnoDB;
Если таблица хранится в MyISAM, естественный порядок строк порядка физические хранятся в файле данных, который не имеет ничего общего с порядком значений или даже порядок, в котором вы создали строк.
Для этих таблиц можно сбросить таблицу в порядке первичного ключа с:
$ mysqldump --order-by-primary databasename tablename > table.sql
Затем восстановить таблицу. Данные будут перезагружены в порядке первичного ключа. Затем в дальнейшем заказ по умолчанию при запросе без использования ORDER BY
будет по ID.Но это не мешает рядам снова выходить из строя при изменении значений.
Re ваши комментарии:
Наилучшим вариантом было бы использовать WHERE
. Это эффективно, потому что он может использовать кластерный индекс, чтобы быстро найти правильную строку.
SELECT * FROM MyTable WHERE ID = 6;
В качестве альтернативы, которая является менее эффективным, но все же лучше, чем возвращение всех строк, чтобы выбрать некоторую строку или строки по их положению в потоке, а не по их стоимости.
SELECT * FROM MyTable LIMIT 1 OFFSET 5;
Первое число - сколько строк вы хотите, второе число - это количество строк, которые нужно пропустить первым.
Обычно вы должны использовать LIMIT
только после указания заказа, иначе вы могли бы получить строки в каком-то бессмысленном порядке, а пятая строка не была бы более желательной, чем первая строка.
SELECT * FROM MyTable ORDER BY created_at LIMIT 1 OFFSET 5;
Вам нужны две разные базы данных или две разные таблицы? – SlavaNov
Извините, две разные таблицы. Я пойду отредактирую это. –
Ответил, посмотрите это - http://en.wikipedia.org/wiki/Order_by – SlavaNov