SonkoDmitry
@SonkoDmitry
Веб разработчик

Вставка большого количества записей в начало таблицы

Господа, подскажите пожалуйста решение, сам увы додуматься не могу. Есть сервис, в нем есть три таблицы, одна основная, две дочерние. На основной выставлены внешние ключи на дочерние. Формат таблицы основной: id, id_table1, id_table2, data (datetime), text. Таблица с логами. Кроме того, еще эта таблица зацеплена внешним ключем с еще одной, куда заносятся только необходимые записи. Так вот задача, раньше логи велись в файлах, их скопилось огромное количество. Хочется из занести все в эту большую табличку, но проблема в том, каким образом сделать смещение автоинкремента. Единственный вариант какой я вижу это по шагам:
1) узнать сколько записей будем вставлять новых
2) остановить запись логов на некоторое время
3) посчитать сколько записей в текущей таблицы и высчитать необходимое смещение
4) увеличить автоинкремент на необходимое смещение
5) запустить запись логов обратно, запись пойдет с нужным смещением
6) пробежаться с хвоста старого блока данных передвигая каждую запись на смещение
7) освободить в начале таблицы нужное место под новые данные
8) вставить новые данные в начало таблицы с принудительным указанием ИД записи

Быть может есть более оригинальное решение? Ибо смещать придется блок из примерно 700к записей в одной и 200к записей в другой таблице. буду крайне благодарен за ответы.
  • Вопрос задан
  • 3486 просмотров
Пригласить эксперта
Ответы на вопрос 5
BuriK666
@BuriK666
Компьютерный псих
А если использовать отрицательные значения?
у Вас было с 1 по xxx, будет с -yyy по xxx
Ответ написан
Комментировать
@Vampiro
я бы сделал так:
1. создал новые таблицы.
2. зафигачил туда все из файлов.
3. отключил логи и констраинты
4. insert into новые_таблицы select (все поля кроме PK) from старые таблицы.
5. переименовал таблички, включил констраинты логи.

как-то так, если я правильно осознал условия.
Ответ написан
hell0w0rd
@hell0w0rd
Просто разработчик
Вы же логи не по id сортируете? Если всеже по id, не знаю на солько правильный вариант:
Добавить новое поле под инкремент
Добавить записи
Старым выставить старым записям новые id
удалить старое поле
Ответ написан
SonkoDmitry
@SonkoDmitry Автор вопроса
Веб разработчик
Увы но нет, обыкновенный таймстамп, который в базе ложится в поле формата datetime. не хотелось дублировать данные и там и там. Я вашу мысль понял, подумаю как можно применить к нашей ситуации
Ответ написан
Комментировать
strib
@strib
Не заморачивайтесь. Для реляционной БД порядок строк не имеет никакого значения. Если уж совсем педантичность жить не дает — перейдите на uuid )
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы