За последние 24 часа нас посетили 26688 программистов и 1511 роботов. Сейчас ищут 906 программистов ...

Перенос строк из одной таблицы в другую

Тема в разделе "MySQL", создана пользователем Dmitriy A. Arteshuk, 25 сен 2014.

  1. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Имеем 2 одинаковые таблицы, id у обоих AUTO_INCREMENT

    надо из одной таблица по кускам переносить данные в другую, казалось бы что может быть проще

    Код (Text):
    1. INSERT INTO table1 SELECT * FROM table2 WHERE что то там = чему то там
    НО, когда у обоих id уникальные, встает вопрос у сервера БД, мол

    #1062 - Duplicate entry '3037' for key 'PRIMARY'

    Пропиши столбцы в INSERT INTO table1 (столбцы) скажите вы....но блин, их больше 70 и все надо переносить (((

    Как выходят из подобной ситуации?
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Можно было бы воспользоваться временной таблицей, но могу предложить и такой вариант:
    Код (PHP):
    1. SET @sql = CONCAT(
    2. 'INSERT INTO <table_1> (',
    3. (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), '<except_field>,', '') 
    4.     FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '<table_1>' AND TABLE_SCHEMA = '<db_name>'),
    5. ') SELECT ', 
    6. (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), '<except_field>,', '') 
    7.     FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '<table_2>' AND TABLE_SCHEMA = '<db_name>'), 
    8. ' FROM <table_2>');
    9.  
    10. PREPARE stmt1 FROM @sql;
    11. EXECUTE stmt1; 
    <db_name> - имя базы
    <table_1> - таблица, в которую копируем
    <table_2> - таблица, из которой тянем данные
    <except_field> - имя поля, которые надо исключить
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Переноси без id? =)
     
  4. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    ну прикинь 70 полей через запятую перечислить 2 раза, бред же ((( неужели нет способа выкинуть одно (((
     
  5. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    перечисли один раз , в скрипте. с его помощью и формируй часть запроса
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Фигасе беда. Я-то думал у тебя что-то не пашет. :) Ну скопируй их тупо из пма. Ты тут дольше писал, чем это делать. :D
     
  7. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    дольше, выкрутился по другому )

    ваще sql конечно хороший язык, но для работы с большими объемами не удобный шо пистец ((( сам себя в угол загоняет и все (((

    вот вставил я 200 строк одиним инсертом, надо теперь 200 вставить в связанную таблицу, надо 200 айдишников вставленных записей....а оно мне говорит, нееее парень, так не пойдет, сделай мне 200 инсертов вместо одного, и тогда сможешь положить меня на бок еще + 200 инсертами (((

    200 то херня....у меня то их сотни тысяч (

    Добавлено спустя 5 минут 9 секунд:
    О! Даже если вас съели, есть 2 выхода )))

    innodb, открываем транзакцию, вставляем, получаем последний ласт инсерт id и вычитаем по единичке )))) трешь блеать )))

    Добавлено спустя 2 минуты 52 секунды:
    да, щас, раскатал, PDO после коммита ноль возвращает )))

    цирк с конями )))
     
  8. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    а можно вопрос. зачем и почему такая ситуация вообще возникла? зачем 2 одинаковые таблицы?
     
  9. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    для исключения ошибок

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

    поэтому данные пишутся во временную таблицу (которая создается полностью аналогичной основной 'CREATE TABLE table_tmp LIKE table') и дальше по кускам сортируются и переносятся в основную и связанные таблицы
     
  10. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    да, по одной записи грызи... а фуля-ж делать, это реляционная БД. ))
    И что-то меня пугает, ты делаешь комит, а потом вставляешь связи?
    Или я ничего не понял, или ты не с той стороны подошел :)

    Буквально неделю назад делал заливалу и конвертилу для новой структуры БД... 40 млн. тут и сам за раз опух бы столько заливать, поэтому построчно, да, все вытащил со связями, переоформил, залил, закомитил.
    И нет другого пути :)

    А, да, еще дурацкая затея была для ускорения - отключить индексацию на заливке.... после первой пробы включив индексацию, осознал, что так делать не стоит :)
     
  11. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    да, будем делать внутри коммита, путем ДОБАВЛЕНИЯ единички, ибо возвращает id первой вставленной записи

    по одной вообще не вариант ((( у многих стоит ограничение на число запросов к БД в час

    Добавлено спустя 6 минут 13 секунд:
    Пилять, у кого там руки чешутся? ))))

    Добавлено спустя 41 секунду:
    Добавлено спустя 43 секунды:
    как не напишу на форум, так сразу сломать пытаются ))) но это гуд!
     
  12. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    ну тута ой, я чота про ограничения не думал.
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Инсерт позволяет селект внутри себя. Вообще не понимаю твоей проблемы.

    Добавлено спустя 8 минут 31 секунду:
    Вставь старый id как другое поле oldid и потом пачкой обнови
     
  14. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Этот селект и написан в корневом посте
    это и будет означать перечисление полей
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Я тебя не понимаю. Ну перечислишь ты поля, и что?
     
  16. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    лень - двигатель прогресса! Лень перечислять! )))