Возможным решением является создание внешних таблиц с макетом исходной таблицы (или, по крайней мере: данными, которые вы хотите передать), одна в исходной базе данных, а другая в целевой базе данных.
В исходной базе данных вы выбираете, что вы хотите перенести из исходной таблицы, и вставляете ее в (пустую) внешнюю таблицу. После этого вы можете скопировать файл в другую базу данных. Если они находятся на одном и том же сервере, можно использовать один и тот же файл напрямую (я не использовал внешние таблицы достаточно, чтобы указать на риски, помимо тех, которые указаны ниже).
В целевой базе данных вы можете затем выбрать из внешней таблицы и вставить в окончательную целевую таблицу.
При создании и использовании внешних таблиц помните следующее:
Файлы внешних таблиц имеют формат данных фиксированной ширины двоичный , в документации, на которую я ссылаюсь, показано, как сделать так, чтобы текст выглядел как текстовый формат фиксированной ширины, но на самом деле это не так.
Правильная интерпретация символьных данных зависит от набора символов (как для правильного преобразования символов, так и для длины данных), например, столбцы UTF8 в 4 раза больше заявленной длины. При создании внешних таблиц явно объявляйте набор символов, чтобы избежать проблем, например, с различными наборами символов по умолчанию между базами данных.
Разница между использованием однобайтового набора символов по сравнению с 4-байтовым набором символов приведет к чрезмерному повреждению, поскольку CHAR(100)
в базе данных WIN1252 будет записываться / считываться как 100 байтов, но в базе данных UTF8 это будет записывать / читать как 400 байт. Поэтому не забудьте явно использовать набор символов, например, CHAR(100) CHARACTER SET WIN1252
.
Учитывая его несжатый характер, лучше использовать однобайтовые наборы символов вместо - например - UTF8, если ваши данные позволяют это.
Внешние таблицы не поддерживают BLOB-объекты или массивы.
Вы не можете удалять или обновлять строки во внешней таблице. Чтобы очистить его, вам нужно удалить базовый внешний файл (Firebird автоматически создаст новый файл при необходимости).
Невозможно определить ограничения первичного ключа или внешнего ключа, а также индексы для внешних таблиц
Чтобы иметь возможность использовать внешние таблицы, вам необходимо настроить Firebird, чтобы он мог обращаться к этим файлам. В firebird.conf
сервера измените значение ExternalFileAccess
со значения по умолчанию None
на ExternalFileAccess = Restrict <path>
, где путь - это папка или список папок, разделенных точкой с запятой, к которым у Firebird есть доступ. Прочитайте документацию об этой опции в файле конфигурации!
(очень) маленький пример. Предполагая, что обе базы данных находятся на одном сервере, и в ваших базах данных есть таблица CUSTOMER
, которую вы хотите перенести:
create table customer (
id integer constraint pk_customer primary key,
customer varchar(25) character set win1252 not null
)
Затем вы создаете эквивалентную внешнюю таблицу:
create table ext_customer external file 'D:\data\DB\exttables\ext_customer.dat' (
id integer not null,
customer varchar(25) character set win1252 not null
)
Создайте эту таблицу как в исходной, так и в целевой базе данных.
Затем в исходной базе данных поместите данные клиента во внешнюю таблицу:
insert into ext_customer (id, customer) select id, customer from customer;
Обязательно совершите коммит.
В целевой базе данных вы можете использовать данные. Например, если таблица customer
в настоящее время пуста, вы можете просто сделать то, что мы сделали в исходном коде:
insert into customer (id, customer) select id, customer from ext_customer;
Если вам нужно больше контроля, посмотрите на MERGE
.