#sql #sqlite #delphi #firebird
#sql #sqlite #delphi #firebird
Вопрос:
Мне нужно сравнить два столбца, объявленных как string в 2 разных базах данных, все значения столбцов, например 10000 строк одновременно. Одна база данных — Firebird, а другая — SQLite. Я хочу создать какую-то контрольную сумму из двух столбцов, чтобы увидеть, есть ли в точности одинаковые значения в двух столбцах.
Для целого числа я могу сделать sum(column)
, и если сумма совпадает с таблицами, я могу предположить, что она имеет те же значения. Это не является пуленепробиваемым, но если записей много, точность увеличивается.
Для числового значения можно использовать то же самое. Однако я не знаю, как сделать аналогичные вещи для столбца string.
Комментарии:
1. Я предлагаю вам использовать хэш, такой как MD5 или SHA, а затем сравнить хэш. Вероятность того, что обнаружение неверно, очень мала с такими хэшами. Намного меньше контрольной суммы.
2. Одна из возможностей — извлечь все строковые значения в Delphi (убедитесь, что вы указали
ORDER BY
предложение для получения согласованных результатов) и вычислить MD5. Для этого вы можете использовать THashMD5 . ВызовитеUpdate()
каждое значение.3. Одним из вариантов, если у вас есть свободное место, было бы загрузить данные из одной базы данных в промежуточную / временную таблицу в другой, а затем использовать запрос EXCEPT между двумя таблицами, чтобы увидеть, отличаются ли какие-либо строки.
4. @Brian Если таблица 1 содержит
A
,A
,B
а таблица 2 содержитA
,B
,B
, то вашEXCEPT
запрос ничего не обнаружит.5. Одно замечание о вашем целочисленном определении — точность сильно зависит от ваших данных — если ваши целочисленные данные имеют одинаковые значения и в каждой строке они могут меняться вверх и вниз с одинаковой дельтой — вероятность предоставления вам ложного равенства не будет очень низкой.
Ответ №1:
Я вижу несколько возможностей.
1. Сравнение строк
Проще всего проверять значения по одной строке на одну строку из кода Delphi. Он имеет огромное преимущество в том, что сразу находит, какая строка данных не синхронизирована.
Но у if есть недостаток чтения всех данных из базы данных.
2. Хэш в SQL ВЫБЕРИТЕ
Если вы хотите выполнить проверку на месте, без извлечения данных, тогда вам нужно вычислить хэш столбцов.
Firebird 4 имеет криптографические хэш-функции, такие как MD5 или SHA1, и вы можете найти подходящую библиотеку UDF для старых версий Firebird. Их легко реализовать с помощью SQLite3 в качестве пользовательской агрегатной функции.
Убедитесь, что вы хэшируете текстовую версию столбцов в формате UTF-8, поскольку содержимое двоичного / необработанного хранилища несовместимо с двумя базами данных.
Затем вы можете вычислить хэш столбца в двух операторах SELECT SQL.
3. Итеративный подход
Если данные вставляются в базу данных, а не обновляются, вы можете добавить поле «хэш» в каждую строку. При вставке строки вы извлекаете последний хэш (который может быть кэширован в памяти для повышения эффективности), затем вы хэшируете новые добавленные значения.
Затем вы можете легко сравнить результирующий хэш последней строки и проверить, совпадают ли данные в обеих БД.
Альтернативой может быть вычисление этого хэша в памяти, а не как поля в БД. Данные будут извлекаться только один раз при запуске, а затем обновляться при вставке чего-либо. Может быть достаточно проверить, синхронизированы ли две базы данных.