Нам очень часто приходится копировать данные из таблиц в самих себя, но при этом заменять значения определённых полей на другие.
И эта простая казалось бы на вид задача вызывает много проблем.
Посткольку мест копирования - десятки, а таблицы с большим количеством полей и прогресс не стоит не месте (постоянно добавляются новые поля), то отследить и откорректировать все запросы очень сложно. Где-то что-то постоянно забывается и потом вылазят баги в самых неожиданных местах.

Команда

INSERT INTO <table> SELECT * FROM <table> WHERE bla-bla-bla;

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

Может у кого-то есть идеи как это просто, надёжно и раз инавсегда сделать имеющимися средствами?

Я ничего подходящего не нашёл, поэтому предлагаю вынести на суд общественности новую фичу - команду COPY для будущих версий FB.
Предлагаю такой синтаксис:

COPY INTO <destination_table_or_view>
FROM <source_table_or_view>
[WITH REPLACE OPTION]
[DEFAULT (<список полей>) ]
[CHANGE
     destination_field_1 = source_field_x,
     destination_field_2 = <expression>,
     destination_field_3 = :<variable>
]
[WHERE <source_table_or_view_condition> ]

Работает так:
1) По умолчанию генерирует коману типа INSERT INTO <destination_table_or_view> SELECT * FROM <source_table_or_view_or_query>, 2) WITH REPLACE OPTION значает что скопированные записи нужно удалить из source_table_or_view 3) DEFAULT - это список полей, которым должно быть задано значение DEFAULT, указнное при описании поля таблицы 4) CHANGE - это список переопределений стандартного копирования. Например я могу какому-то полю присвоить при копировании значение поля с другим именем, или выражения, или ещё чего-то там что понадобится
5) WHERE - это условие, по которому строится запрос.

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

Ответить