Конференция "Базы" » Добавление запросом блоками с заданной последовательностью ключа [D7, MySQL]
 
  • Дмитрий (09.10.14 19:01) [0]
    Как запросом добавить блок записей с требуемой последовательностью значений ключевого поля?
    Мне нужно из старой формы добавлять позиции блоками условно с позиции А=10`000, а в новой форме начиная с поз. Б=10`000`000.

    Изначальный запрос имеет вид

    INSERT INTO Изделия (...)
    Select ...
    From Справочник
    Where КодТовара in (a, b, ..., n)


    Т.е. количество записей определяется списком выбранных товаров.
    Для одной записи вставить нужный id не проблема, как сделать так же для пачки?

    Можно ли применить переменные
  • Кщд © (09.10.14 19:39) [1]
    да, просто добавьте значение переменной (id пачки) в условие select
  • Дмитрий (10.10.14 16:08) [2]
    не пойму как в одном выражении инициализировать переменную и реализовать инкремент

    @id:= 10000 ;
    select @id:=@id +1;
  • Кщд © (10.10.14 17:52) [3]
    можно пример набора, который надо получить?
    речь о SQL, а вы о каких-то формах, блоках и пр.
  • DQ (10.10.14 23:08) [4]
    аммм... MySQL не приходилось вплотную, но разве так не сработает?

    INSERT INTO new_table (id, ...) SELECT id+9990000, ... FROM old_table WHERE ...
  • Кщд © (10.10.14 23:43) [5]
    >DQ   (10.10.14 23:08) [4]
    верная дорога в ад, одобряю
    два запроса начинают работать одновременно, и - вуаля
  • DQ (11.10.14 04:17) [6]
    Чего не так-то? На SQLServer'е десятки раз так копировал, и во временные таблицы и в другую БД - и всё в порядке.
  • turbouser © (11.10.14 15:00) [7]

    > Кщд ©   (10.10.14 23:43) [5]

    С виду все нормально. об чем спич?

    > DQ

    тс надо не скопировать из откуда-то, а разпараллелить вставку из старого и из нового. С разными ID
    вообще, затея бредовая :(
  • Кщд © (11.10.14 16:12) [8]
    >turbouser ©   (11.10.14 15:00) [7]
    >С виду все нормально. об чем спич?
    получать новый ID виде: IDNew = IDOld + const, - в многопользовательской среде чревато коллизиями
    зачем выдумывать велосипед с квадратными колёсами, когда есть спец. инструменты для генерации ID?
  • turbouser © (11.10.14 16:17) [9]

    > Кщд ©   (11.10.14 16:12) [8]


    > получать новый ID виде: IDNew = IDOld + const, - в многопользовательской
    > среде чревато коллизиями

    так у DQ этого нет
    там просто из одной таблицы в другую. причем весьма глупо
  • turbouser © (11.10.14 16:23) [10]

    > Кщд ©  

    аааа перечитал. пепел на мою голову :(
  • DQ (11.10.14 17:20) [11]
    Я не генерирую "новые ID", тем более с многопользовательской... Останавливаем программу использующую БД, меняем данные, запускаем обратно.

    > разпараллелить вставку из старого и из нового. С разными ID

    В [1] не вижу ничего похожего. Дословно понял ТЗ так: надо единократно поправить данные в БД таким-то образом: были id с позиции такой-то, нужно поменять чтоб были с начиная с позиции такой-то, т.е. грубо говоря увеличить id у группы строк на некоторое число. Знаю похожую ситуацию. Написал рабочее решение. Если это не то что нужно ТС - то уже отдельный разговор, давайте ждать от него пояснений.
  • Кщд © (11.10.14 17:52) [12]
    >Я не генерирую "новые ID", тем более с многопользовательской..
    и
    >DQ   (10.10.14 23:08) [4]
    >INSERT INTO new_table (id, ...) SELECT id+9990000, ... FROM old_table WHERE ...

    не согласуется
    в общем, сам такой подход - ущербен
    оставьте генерацию ID - базе
  • DQ (11.10.14 18:13) [13]
    Нет никакого "подхода". Ну бывает что данные повредились. И нужно скопировать данные с конкретными id или изменить id. А после того как данные исправлены - разумеется пусь генерирует сама, никто не собирается за неё это делать.
  • Игорь Шевченко © (12.10.14 11:40) [14]
    Кщд ©   (11.10.14 17:52) [12]

    Нам до сих пор неизвестно, что хочет автор ветки :)
  • Дмитрий (13.10.14 16:22) [15]
    Автор ветки хочет в новой форме при добавлении нескольких изделий запросом генерацию ID начиная с Б, чтобы в старой форме генерация продолжалась с А.

    При добавлении одного изделия проблемы нет.
    Затруднение при добавлении нескольких изделий.

    Вопрос копирования не ставился, но существует.
    Только не из old_table, а из себя в себя.
    Регулярно требуется повторять заказ клиента.
  • Кщд © (13.10.14 16:55) [16]
    >Дмитрий   (13.10.14 16:22) [15]
    автор, пример
    автор, на SQL
    автор, про ваши "формы", "изделия" и пр. нам невдомёк

    автор, шаблон примера:
    1. было так. добивался этого эдак (код);
    2. хочу, чтобы было вот так.
  • Дмитрий (13.10.14 17:39) [17]
    Ранее я никак не добивался "двухслойной генерации".
    Используемый запрос я привел, он совершенно обычный, без извратов с генерацией.
    Там  существенен только список ключей- идентификаторов.

    INSERT INTO Изделия (...)
    Select ...
    From Справочник
    Where Справочник.КодТовара in (id_i, id_m, ..., id_x)



    Собираюсь реализовать ее для одиночных записей как запрос
    Insert into ...
    select max(id) + 1, ...
    where id<1000000; -- для второго "слоя": id>1000000



    Хочу (получив предварительно или непосредственно в запросе) генерировать последовательность нескольких ключей и вставлять их в таблицу.
    Количество новых записей (и ключей) соответствует количеству кодов в списке
    INSERT INTO Изделия (id, ...)
    Select generator_id(), ...
    From Справочник
    Where Справочник.КодТовара in (id_i, id_m, ..., id_x)



    Очень желательно вставлять генерируемый ключ не в одно, а в два поля
    INSERT INTO Изделия (id, link_id, ...)
    Select @id:=generator_id(1000000), @id,...
    From Справочник
    Where Справочник.КодТовара in (id_i, id_m, ..., id_x)




    > Кщд ©   (11.10.14 17:52) [12]
    > DQ   (10.10.14 23:08) [4]>INSERT INTO new_table (id,
    > ...) SELECT id+9990000, ... FROM old_table WHERE ...не согласуетсяв
    > общем, сам такой подход - ущербеноставьте генерацию ID -  базе

    интересует копирование нескольких записей со сдвигом значения ключа
  • Кщд © (14.10.14 09:34) [18]
    >Дмитрий   (13.10.14 17:39) [17]
    select max(id) + 1


    так делать нельзя в многопользовательской среде

    >интересует копирование нескольких записей со сдвигом значения ключа
    для чего?
    вам необходимо определять к какому блоку принадлежат записи, и вы собираетесь делать это по диапазону?

  • Дмитрий (14.10.14 17:58) [19]

    > Кщд ©   (14.10.14 09:34) [18]
    > >select max(id) + 1
    >так делать нельзя в многопользовательской среде

    отчего ж нельзя,
    в случае чего просто будет ошибка добавления записи
 
Конференция "Базы" » Добавление запросом блоками с заданной последовательностью ключа [D7, MySQL]
Есть новые Нет новых   [118667   +41][b:0][p:0.001]