Если вы не укажете явный порядок, тогда первая строка не имеет никакого смысла;набор результатов из определенного запроса в определенный момент времени, конечно, будет иметь первую строку, но нет гарантии, что повторный запуск того же запроса с теми же данными приведет к той же первой строке.Таблицы в реляционной базе данных не упорядочены, поэтому нет указанного существующего порядка .Вы делаете плохое предположение;реализация может неявно упорядочивать записи PK на диске, но это не гарантирует и не гарантирует, что следующая версия будет вести себя так же;Более того, нет никакой гарантии, что база данных будет возвращать строки в порядке дисков, база данных может свободно упорядочивать строки любым удобным для нее способом, если только вы не указали конкретный порядок с помощью предложения ORDER BY.
Еслиесли вы хотите заказать, вы должны включить предложение ORDER BY;Вы, вероятно, хотите что-то более похожее на это:
a = A.where("col2 = :id OR col1 = :id", {:id => 3}).order(:id).first
И если вы хотите посмотреть на col2
до col1
, то вам следует сказать так:
a = A.where('col2 = :id', :id => 3).order(:id).first \
|| A.where('col1 = :id', :id => 3).order(:id).first
col2 = :id OR col1 = :id
иcol1 = :id OR col2 = :id
являются эквивалентными логическими выражениями, поэтому база данных может свободно проверять col2 = :id
до, после или одновременно с col1 = :id
, и имеет свободный доступ к строкам в любом порядке.