Возможна сортировка SQL при вставке?

#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 столбце