Вы правы. При чтении таблицы MySQL строка за строкой из приложения небезопасно предполагать , что таблица будет всегда читаться сверху вниз, одна за другой в идеальном последовательном порядке. Небезопасно предполагать, , что если таблица упорядочена по уникальному идентификатору, и я читаю ее (через C ++ или иным образом) по одной строке за раз, вы будете получать каждую строку в точном порядке уникального идентификатора каждый время.
На любую СУБД это не гарантируется. Никто не должен полагаться на это предположение.
Строки не имеют (Чтение: не должно иметь) внутреннего порядка или порядка по умолчанию в реляционных таблицах. Таблицы (отношения) по определению являются неупорядоченными множествами или строками.
Создается впечатление, что большинство систем, когда их просят вернуть результат для запроса, подобного:
SELECT columns
FROM table
они извлекают все строки с диска, читая весь файл. Таким образом, они возвращают строки (обычно) в том порядке, в котором они были сохранены в файле, или в порядке кластеризованного ключа (например, в таблицах InnoDB в MySQL). Таким образом, они возвращают результат с одним и тем же заказом каждый раз.
Если в предложении FROM
несколько таблиц или есть условия WHERE
, это совершенно другая ситуация, поскольку не все таблицы читаются, могут использоваться разные индексы, поэтому система может не прочитать файлы таблиц, но только файлы индекса. Или прочитайте небольшую часть таблиц.
Это также другая история, если у вас есть многораздельные таблицы или распределенные базы данных.
Вывод: в ваших запросах должна быть часть ORDER BY
, если вы хотите каждый раз гарантировать один и тот же заказ.