Перенос данных между таблицами может иметь продолжительный период. Например если таблица весит пару сотен гигабайт, а хранилище работает на HDD дисках и эти диски читают другие приложения.
В результате будет разумным перенести сначала более ценные записи таблицы, а уже потом все остальные. Под ценными данными каждый будет понимать что-то своё. Но на практике, чем более заполненной является запись таблицы, тем больше информации она содержит, тем полезнее она может быть.
В результате, это неизбежно приведёт к ситуации, когда заливка оставшейся части данных начнёт конфликтовать с уже имеющимися данными в новой таблице. Как так получается? Да очень просто. Ценные данные были хаотично разбросаны по разным участкам таблицы. Если переносить удобным способом по возрастанию первичных целочисленных ключей, то часть идентификаторов уже будет присутствовать в новой таблице после первичного переноса ценных.
При таком процессе может возникнуть логичный проблемный момент, когда копируемая запись уже будет присутствовать в новой таблице.
Чтобы не реагировать на подобные конфликты и пропускать их, нужно использовать предложение:
ON CONFLICT (id) DO NOTHING
Дословно читается как «если конфликт по полю id, тогда ничего не делай и иди дальше«. Запись НЕ ВСТАВЛЯЕТСЯ в новую таблицу. PostgreSQL посмотрит на конфликт и проигнорирует его. Но, нужно не забывать, что на время переноса данных это не сильно повлияет. Не получится быстрее, так как проверку всё равно нужно делать.
Информационные ссылки
Официальный сайт WEB-оболочки pgAdmin — https://www.pgadmin.org
Официальный сайт СУБД PostgreSQL — https://www.postgresql.org
Официальный сайт клиента DBeaver для СУБД PostgreSQL — https://dbeaver.io
Предложение ON CONFLICT — https://postgrespro.ru/docs/postgresql/15/sql-insert#SQL-ON-CONFLICT