Имеем 2 одинаковые таблицы, id у обоих AUTO_INCREMENT надо из одной таблица по кускам переносить данные в другую, казалось бы что может быть проще Код (Text): INSERT INTO table1 SELECT * FROM table2 WHERE что то там = чему то там НО, когда у обоих id уникальные, встает вопрос у сервера БД, мол #1062 - Duplicate entry '3037' for key 'PRIMARY' Пропиши столбцы в INSERT INTO table1 (столбцы) скажите вы....но блин, их больше 70 и все надо переносить ((( Как выходят из подобной ситуации?
Можно было бы воспользоваться временной таблицей, но могу предложить и такой вариант: Код (PHP): SET @sql = CONCAT( 'INSERT INTO <table_1> (', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), '<except_field>,', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '<table_1>' AND TABLE_SCHEMA = '<db_name>'), ') SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), '<except_field>,', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '<table_2>' AND TABLE_SCHEMA = '<db_name>'), ' FROM <table_2>'); PREPARE stmt1 FROM @sql; EXECUTE stmt1; <db_name> - имя базы <table_1> - таблица, в которую копируем <table_2> - таблица, из которой тянем данные <except_field> - имя поля, которые надо исключить
ну прикинь 70 полей через запятую перечислить 2 раза, бред же ((( неужели нет способа выкинуть одно (((
Фигасе беда. Я-то думал у тебя что-то не пашет. Ну скопируй их тупо из пма. Ты тут дольше писал, чем это делать.
дольше, выкрутился по другому ) ваще sql конечно хороший язык, но для работы с большими объемами не удобный шо пистец ((( сам себя в угол загоняет и все ((( вот вставил я 200 строк одиним инсертом, надо теперь 200 вставить в связанную таблицу, надо 200 айдишников вставленных записей....а оно мне говорит, нееее парень, так не пойдет, сделай мне 200 инсертов вместо одного, и тогда сможешь положить меня на бок еще + 200 инсертами ((( 200 то херня....у меня то их сотни тысяч ( Добавлено спустя 5 минут 9 секунд: О! Даже если вас съели, есть 2 выхода ))) innodb, открываем транзакцию, вставляем, получаем последний ласт инсерт id и вычитаем по единичке )))) трешь блеать ))) Добавлено спустя 2 минуты 52 секунды: да, щас, раскатал, PDO после коммита ноль возвращает ))) цирк с конями )))
для исключения ошибок идет импорт записей в БД, записей сотни тысяч, мало какой сервак за раз их может обработать поэтому данные пишутся во временную таблицу (которая создается полностью аналогичной основной 'CREATE TABLE table_tmp LIKE table') и дальше по кускам сортируются и переносятся в основную и связанные таблицы
да, по одной записи грызи... а фуля-ж делать, это реляционная БД. )) И что-то меня пугает, ты делаешь комит, а потом вставляешь связи? Или я ничего не понял, или ты не с той стороны подошел Буквально неделю назад делал заливалу и конвертилу для новой структуры БД... 40 млн. тут и сам за раз опух бы столько заливать, поэтому построчно, да, все вытащил со связями, переоформил, залил, закомитил. И нет другого пути А, да, еще дурацкая затея была для ускорения - отключить индексацию на заливке.... после первой пробы включив индексацию, осознал, что так делать не стоит
да, будем делать внутри коммита, путем ДОБАВЛЕНИЯ единички, ибо возвращает id первой вставленной записи по одной вообще не вариант ((( у многих стоит ограничение на число запросов к БД в час Добавлено спустя 6 минут 13 секунд: Пилять, у кого там руки чешутся? )))) Добавлено спустя 41 секунду: Добавлено спустя 43 секунды: как не напишу на форум, так сразу сломать пытаются ))) но это гуд!
Инсерт позволяет селект внутри себя. Вообще не понимаю твоей проблемы. Добавлено спустя 8 минут 31 секунду: Вставь старый id как другое поле oldid и потом пачкой обнови