#sql #sqlite #sorting #insert
#sql #sqlite #сортировка #вставить
Вопрос:
В SQL при вставке в предварительно отсортированную таблицу можно ли вставить строку при сортировке строки вместе со всей таблицей? Например
create table positional_order (
num number,
txt varchar2(10)
);
существующая таблица
row 1 (3, 'three' );
row 2 (4, 'four' );
вставить новую строку
row 3 (1, 'one');
после вставки
таблица становится
row 1 (1, 'one');
row 2 (3, 'three' );
row 3 (4, 'four' );
Возможно ли это?
Или я должен вставить строку в таблицу, а затем выбрать порядок по?
Кстати, я использую sqlite.
Спасибо,
Ответ №1:
Насколько я знаю, вставка строки в определенное местоположение не является частью какой-либо стандартной базы данных SQL. Часть работы базы данных заключается в определении того, как логически хранить строки. Как вы сказали, время для упорядочивания строк наступает, когда вы выполняете ВЫБОР, используя ORDER BY .
Если вас беспокоит производительность, создайте индекс в столбце «число». Подробнее об индексах здесь
Ответ №2:
Краткий ответ: таблицы представляют собой наборы и не имеют порядка.
Длинный ответ: Кластеризованный индекс настолько близок, насколько это возможно, и даже это на самом деле не так уж близко — без order by механизм запросов может возвращать результаты в любом порядке, который он считает наилучшим. Кластеризованный индекс будет означать, что запрос только к этой таблице, скорее всего, вернет строки в порядке, определенном для индекса, но не рассчитывайте на это. Тем не менее, все индексы определяют порядок, а кластеризованный индекс определяет порядок записей на диске, хотя это не гарантирует ваши результаты в каком-либо определенном порядке, но делает его вероятным в большинстве случаев. Но я бы тщательно подумал, прежде чем использовать кластеризованный индекс для чего-либо, кроме автоматически сгенерированного / увеличенного столбца. Если вы вставляете в таблицу с кластеризованным индексом, записи на диске, возможно, придется перемещать, а это дорогостоящая операция.
Комментарии:
1. кластеризованный индекс — это здорово! К сожалению, sqlite не поддерживает кластеризованный индекс. Они могут создавать таблицу wibble2 только как select * из wibble; удалить из wibble; вставить в wibble select * из wibble2 по порядку по ключу; удалить таблицу wibble2;
2. @user965229: он может не поддерживать кластеризованные индексы, но он поддерживает индексы. Найдите создать индекс. И, как я уже сказал, если вам нужен определенный порядок, вы все равно должны использовать order by .
3. При определенном индексе во время запуска select order by база данных не будет выполнять сортировку с нуля. Он должен просто возвращать строки на основе указателей индекса. И я должен получить немедленный ответ в запросе, а не ждать, даже если я имею дело с миллионами строк. Это правильно? Спасибо
4. @user965229: грубо говоря, да. Опять же, это не гарантируется без order by , но если есть покрывающий индекс, это, скорее всего, тот заказ, который вы получите, и если у вас есть order by , у него должно быть меньше работы, поскольку результаты будут в основном предварительно заказаны.
5. sqlite поддерживает кластеризованные индексы, начиная с версии версии 3.8.2 (2013-12-06): sqlite.org/withoutrowid.html
Ответ №3:
Это невозможно, нет. Данные в таблице SQL фактически не «сортируются» по умолчанию. Вам нужно будет использовать ORDER BY
предложение в вашем приложении, чтобы получить результаты в нужном порядке.
Ответ №4:
Я не думаю, что это возможно, но вам это и не нужно; как вы сказали, вы можете либо выполнить order by; или определить индекс в num
столбце