Я пишу новую версию своего приложения, которая добавляет функции, а также исправляет некоторые существующие проблемы. Чтобы сделать обновление без шва, у меня есть значение DBVersion, которое я увеличиваю с каждой новой версией. Когда моя программа открывается впервые, она делает любые обновления, необходимые для обновления базы данных.
Упрощенный код:
if (dbVersion < 7)
{
//make schema changes as needed
}
Теперь у меня есть ситуация, когда у меня есть таблица клиентов, в которой содержатся клиенты, полученные из QuickBooks. В настоящее время у меня также есть таблица заказов, в которой есть поле "клиент". Проблема в том, что, поскольку имя клиента используется для первичного ключа, и у меня нет связи с внешним ключом в таблице заказов, я получаю поврежденные данные, если имя клиента изменяется. Чтобы исправить эту ситуацию, я планирую добавить поле QBID в таблицу клиентов. Это постоянный идентификатор, который остается неизменным даже в случае изменения имени клиента. Чтобы добавить поле QBID, мне нужно удалить всех клиентов, добавить столбец (NOT NULL), а затем повторно добавить клиентов с полем QBID.
DELETE FROM Customers;
ALTER TABLE customers ADD COLUMN IF NOT EXISTS qbid Character Varying( 20 );
ALTER TABLE customers DROP CONSTRAINT IF EXISTS unique_customers_QBID;
ALTER TABLE customers ADD CONSTRAINT unique_customers_QBID UNIQUE(qbid);
Проблема в том, что я не могу добавить ограничение внешнего ключа, пока не будут импортированы новые данные о клиенте (после обновления схемы базы данных), или пока все поля моих клиентов не будут установлены в нуль.
update orders set customer = null where id in
(Select o.id from orders o left join customers c on c.name = o.customer where c.name is null);
ALTER TABLE orders ADD CONSTRAINT lnk_customers_orders FOREIGN KEY (customer)
REFERENCES customers ("name") MATCH FULL ON DELETE No Action ON UPDATE Cascade;
Чтобы еще больше усложнить задачу, программа, получающая элементы, представляет собой отдельное приложение, и я не могу просить получать эту обновленную информацию о клиентах во время обновления схемы.
Я думал о том, чтобы пропустить номер DBversion и использовать его для обновления схемы после первого импорта данных клиента. Проблема с этим подходом состоит в том, что я всегда буду нуждаться в проверке версии БД при обновлении клиентов из QB.
UpdateCustomers();
var DBVersion = GetDBVersion();
if (DBVersion < 8) UpdateSchema(8);
Есть ли лучший способ ускорить процесс обновления?