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