MySQL « Добавить строку в конец таблицы.

День добрый...
Проблема походу пустяшная, но я SQL только начинаю изучать.
Смысл проблемы в том, что если удалить строку из бд, то новая строка встает на ее место а не в конец таблицы. А мне надо в конец... Как это лечиться? Заранее спасибо.

1 ответов


Так вы сортируйте как вам надо и будет всё хорошо?
SELECT * FROM table ORDER BY id


Это не лечится by design. Дело в том, что у таблицы нет начала и конца. Таблица в базе данных это абстракция, физически она может храниться как угодно: в одном или нескольких файлах на дисках, на нескольких дисках, в памяти или вообще не важно где. Таким образом, база данных сама решает в каком виде хранить данные. Базы данных обычно выбирают строки так, как им это сделать проще всего. Для случая хранения данных в файле на диске, проще всего - это читая последовательно файл, в результате обычного селекта без сортировки мы видим один и тот же порядок строк. Закладываться на него не стот (может измениться в результате реорганизации файла данных). А главное, по страндарту порядок вывода строк не гарантируется.

Если вам нужно закрепить порядок строк в порядке вставки, нужно его (порядок) явно указать при выборке с помощью order by. В качестве поля, по которому сортировать, можно взять поле ID, если номера возрастают с каждой новой записью. Либо завести специальное поле "дата и время вставки", но это хуже, плюс желательно на него еще повесить индекс.

Вообще по этому случаю в Oracle есть специальный хинт APPEND, который рекомендует базе данных не искать "дырки" вместо удаленных строк, а сразу писать в конец тейблспейса после последней строки. Применяется так:

INSERT /*+ APPEND */ INTO table_name ...В результате инсерт происходит несколько быстрее, что особенно заметно на больших объемах данных. Но данная операция раздувает пространство, так как место, потенциально освобожденное в результате удаления строк, не возвращается и продолжает занимать место.

Возможно в mySQL есть аналог этого хинта, не смог найти. В любом случае, не советую его применять. Он не предназначен для закрепления порядка строк. Привел его тут только ради примера.

С натяжкой понятно о чем вы. Структуру таблицы приведите. По всей видимости вам нужно почитать про order by и primary key