Как сделать перенос данных с одной таблицы в другую?
Подскажите, каким запросом перенести данные с одной таблицы в другую? Две таблицы полностью идентичны, но записи с теми же ключами в целевой таблице могут уже присутствовать. Структура обоих таблиц:
dle_post (id int primary key, col1, col2, . )
Нужно перенести записи в таблице dle_post в таблицу dlew_post . Так получаю ошибку:
insert into dlew_post select * from dle_post
#1062 — Дублирующаяся запись ’50’ по ключу ‘PRIMARY’
Отслеживать
51.6k 200 200 золотых знаков 61 61 серебряный знак 242 242 бронзовых знака
задан 11 апр 2021 в 21:59
Виталий Мукменёв Виталий Мукменёв
5 1 1 серебряный знак 4 4 бронзовых знака
insert into table1 select * from table2
11 апр 2021 в 22:19
так может стоит описывать проблему целиком, а не просто «как перенести». добавлю я в этот запрос джойн чтоб исключить совпадения ключей, а вы напишите, что совпадения надо проапдейтить, а не игнорировать. Сформулируйте нормально что есть, что надо сделать и что в результате хотите получить
sql перенос данных из одной таблицы в другую
Возникла следующая проблема: для некоторого приложения нужно было удалить поле tags = TaggableManager(blank=True) (и соответственно зависимость django-taggit). Как обычно, стираю это поле и вызываю makemigration, который сделал своё дело как надо. Но при вызове migrate для другого проекта с тем же набором миграций происходит ошибка, что приложение taggit не найдено для выполнения миграций. Оно, конечно, и логично, что миграции будут требовать это приложение.
Сейчас я понимаю, что просто можно было поправить миграции, где создавалось поле taggit и где оно удалялось, поэтому если вы так не сделали и у вас изменилась структура данных таблицы, то ниже описанные действия могут помочь.
Перенос данных из таблицы разной структуры
Допустим, у нас есть приложение projects и таблица projects_project с полями:
- id
- link (ссылка на страницу проекта)
- title_in_link (показываемая подсказка при наведении на ссылку)
- order (путь до картинки)
- border_color (цвет границы)
- tags (теги)
Мы хотим следующую структуру:
- id
- link
- hint
- order
- is_border
- border_color
- border_width
Тем самым мы видим следующие изменения:
- title_in_link переименовался в hint.
- Добавилось поле is_boder, при этом оно обязательно для заполнения.
- border_width, которое может быть пустым.
- Удалилось поле tags
А теперь «вручную» исправим структуру таблицы:
- Переименовываем таблицу: projects_project -> projects_project_old.
- Удаляем все миграции приложения, а также удаляем соответствующие записи миграций в таблице django_migrations в базе данных.
Чтобы удалить миграции определённых приложений в базе данных, я обычно захожу в pgadmin, нажимаю просмотр данных таблицы django_migrations, ввожу условие фильтрации, например:
app = 'picture' OR app = 'gallery' OR app = 'file'
И удаляю все найденные строки.
- Вызываем makemigration для формирования 0001_initial.py (при этом понимаем, что придётся восстановить таблицу с помощью sql команд).
- Вызываем migrate и смотрим, что в базе данных создалась таблица projects_project с правильной структурой данных.
- Пишем sql код переноса данных из projects_project_old в projects_project:
INSERT INTO projects_project(id, link, hint, "order", is_border, border_color) select id, link, title_in_link, "order", 'FALSE', border_color from projects_project_old;
Проанализируйте пример: как видите, идёт соответствие полей для заполнения. В интернете качественного примера я не нашёл, поэтому-то и родился сей пост, чтобы это дело восполнить 🙂
Обратите внимание, что border_width мы можем не заполнять, так как оно может быть пустым, а is_border мы должны заполнить, но, так как у нас нет информации об этом поле, то самое простое — это заполнить значением FALSE для каждой записи. Как вариант потом можно написать django миграцию для заполнения полей TRUE или FALSE в зависимости от наличия какого-либо значения в поле border_color, но это уже другая история.
Ещё обратите внимание на то, что поле order совпадает со служебным словом sql, поэтому нужно это поле обособить двойными кавычками.
- Удаляем таблицу projects_project_old.
Вот, и всё. Ещё раз повторюсь, этот пример для тех, кто случайно сломал структуру данных таблицы, или миграции поломал или, таким образом как я, удалял зависимости от приложения. Это долгий «sql-ручной» путь исправления структуры, поэтому прежде чем удалять миграции, попробуйте их просто поправить 🙂
Перенос данных связанных таблиц
Допустим есть таблица: gallery и picture. Таблица picture содержит внешний ключ на таблицу gallery.
Этот случай немного по сложнее: при попытке выполнить 4 шаг описанный выше django скорее всего будет ругаться примерно так:
django.db.utils.ProgrammingError: relation "gallery_picture_6d994cdb" already exists
Для решения проблемы нужно переименовать индекс:
ALTER INDEX public.gallery_picture_6d994cdb RENAME TO gallery_picture_old_6d994cdb;
Это можно сделать через графический интерфейс pgadmin:
Нужный нам индекс выделен зелёным. Теперь правой кнопкой мыши по щелчку на индекс вызываем контекстное меню и выбираем свойства:
Здесь нужно переименовать индекс, например, дописав «_old».
Теперь снова пытаемся выполнить шаг 4 и далее следуем остальным выше описанным шагам.
Перенос данных из одной таблицы в другую
Добрый день, Как перенести данные из одной таблицы в другую, в частности интересует как перенести файл загруженный в БД (MySQL)?
2 Reply by DriveSoft 2018-08-15 10:04:18
Re: Перенос данных из одной таблицы в другую
Это можно сделать SQL запросом, пример
INSERT INTO table1(filefield, filefield_filename) SELECT filefield, filefield_filename FROM table2 WHERE table2.id=1
3 Reply by Evgeniy D 2018-08-15 14:08:11 (edited by Evgeniy D 2018-08-15 14:08:43)
Re: Перенос данных из одной таблицы в другую
Этот код (ниже) выдает ошибку «Could not convert variant of type (Array Byte) into type (Integer)»
SQLExecute('INSERT INTO komentar (vlo_kompor, vlo_kompor_filename) SELECT vlo_kompor, vlo_kompor_filename FROM koment_por WHERE koment_por.id='+inttostr(i)+'');
4 Reply by m.prokhachev 2018-08-15 17:50:32
Re: Перенос данных из одной таблицы в другую
Дмитрий, тут большинство не сильны в программировании баз данных, поэтому свои примеры желательно разжевывать тщательнее) это я еще могу понять, что к чему, а вот большинство — не очень.
Евгений, для тупого копирования содержимого одной таблицы в другую вам надо выполнить запрос такого вида:
INSERT INTO table2 (fieldname1, fieldname2, . ) SELECT fieldname1, fieldname2, . FROM table1
где table1 — название таблицы, откуда копируется, table2 — название таблицы, куда копируется, а fieldname1, fieldname2, . — это название полей данных (таким образом вы можете выбрать какие поля хотите переносить в новую таблицу из старой).
Вы можете перенести ВСЕ поля со всеми данными следующим запросом:
INSERT INTO table2 SELECT * FROM table1
Если надо перенести данные с каким-то условием, то после FROM table1 используйте конструкцию WHERE , где — ваше условие выборки данных.
Копирование записей из одной таблицы в другую MySQL
Примеры SQL-запросов для копирования записей из разных таблицы.
Частичное копирование
К примеру есть две одинаковые по структуре, нужно из таблицы `table_a` скопировать запись с определенными полями в таблицу `table_b`.
INSERT INTO `table_a` (`name`, `alt`, `page`) SELECT `name`, `alt`, `page` FROM `table_b` WHERE `id` = 1
Копирование нескольких записей:
INSERT INTO `table_a` (`name`, `alt`, `page`) SELECT `name`, `alt`, `page` FROM `table_b` WHERE `id` IN(1,2,3)
Полное копирование
Если таблицы `table_a` и `table_b` полностью одинаковые по структуре, то названия полей можно опустить.
INSERT INTO `table_b` SELECT * FROM `table_a`
Или указать только нужные поля:
INSERT INTO `table_a` (`name`, `alt`, `page`) SELECT `name`, `alt`, `page` FROM `table_b`
Подгонка структуры таблицы
Если таблицы разные по структуре, то можно подогнать названия и значения полей.
INSERT INTO `table_b` (`name`, `alt`, `page`, `module`, `sort`) SELECT `filename` AS `name`, '' AS `alt`, `page`, 'prod' AS `module`, 1 AS `sort` FROM `table_a`
Копирование с подзапросом в третью таблицу
INSERT INTO `table_b` (`name`, `alt`, `page`, `module`, `sort`) SELECT (SELECT `name` FROM `table_c` WHERE `item_id` = `table_a`.`id`) AS `name`, '' AS `alt`, `page`, 'prod' AS `module`, 1 AS `sort` FROM `table_a`
Копирование записей из двух и более таблиц
INSERT INTO `table_b` (`name`, `email`, `address`) SELECT * FROM ( (SELECT `name`, `email`, `address` FROM `table_a`) UNION ( SELECT `name`, `email`, `address` FROM `table_c`) )
