Синхронизация таблиц из разных mysql-баз

grind3r

Новичок
Синхронизация таблиц из разных mysql-баз

Доброго времени суток!
Возникла потребность переделать php-скрипт синхронизации таблиц.
Вроде простая задача, но хочется разобраться подробно и найти самое простое решение.
Условно обозначим:
- t1: таблица1. Та, которая должна быть обновлена.
- t2: таблица2. Та, из которой берутся данные для обновления.
----------------------
Прежняя версия скрипта:
- берет все записи из таблицы t2
- добавляет и обновляет записи в t1
- НЕ УДАЛЯЮТСЯ ЗАПИСИ, которых уже нет в t2
- обновление с помощью вот такого запроса:
INSERT t1 (поля)
SELECT поля FROM t2
ON DUPLICATE KEY UPDATE
поле1 = VALUES(поле1), поле2 = VALUES(поле2),...
----------------------
В новой постановке:
"...нужно доработать логику, чтобы из таблицы удалялись записи, которые отсутствуют в t2. При удалении делать проверку, чтобы удаляемые записи не имели связей, а так же не имели дочерних записей."

Новая версия должна:
- брать все записи из таблицы t2
- добавлять и обновлять записи в t1
- УДАЛЯТЬ ЗАПИСИ, которых уже нет в t2
* Примечание: Вариант с предварительной очисткой t1 не подходит
=======================
Что можете посоветовать? Какие лучше внести изменения в скрипт:
1. Накрутить php-логику
2. Накрутить SQL-логику

Сопутствующие вопросы (не принимайте за глупость):
- В php есть функция mysql_affected_rows(), но нет обратной, например mysql_not_affected_rows(). Мелочь, а приятно было бы. Кто-нибудь решал практически задачу по выборке не затронутых, в результате последнего запроса, записей?
 

zerkms

TDD infected
Команда форума
Кто-нибудь решал практически задачу по выборке не затронутых, в результате последнего запроса, записей?
написать прямо противоположные условия выборки и радоваться.
 

x-yuri

Новичок
добавляешь в t1 поле updated, в INSERT ... SELECT устанавливаешь его в 1. После вставки/обновления можешь работать с незатронутыми записями
 

zerkms

TDD infected
Команда форума
если было условие `id` < 100, то противоположное это `id` >= 100
 

grind3r

Новичок
Автор оригинала: x-yuri
добавляешь в t1 поле updated, в INSERT ... SELECT устанавливаешь его в 1. После вставки/обновления можешь работать с незатронутыми записями
В таком варианте нужно шевелиться и добавлять доп. поле в табличку. Может есть более красивое предложение?..

-~{}~ 15.01.09 15:09:

Автор оригинала: zerkms
если было условие `id` < 100, то противоположное это `id` >= 100
Примени к моей задаче. Как будет выглядеть запрос?
 

zerkms

TDD infected
Команда форума
grind3r
у тебя был "сопутствующий вопрос". я на него ответил. хочешь конкретики - приведи конкретный запрос.
 

grind3r

Новичок
Автор оригинала: x-yuri
а, кстати, почему репликация не подходит?
Я по поводу репликации не откомментировал. Нормальный вариант... но можно еще поразмышлять.
 

x-yuri

Новичок
имхо репликация самый "красивый" вариант, потому что она как раз предназначена для твоей задачи и ее не надо самому писать
 

grind3r

Новичок
Автор оригинала: x-yuri
имхо репликация самый "красивый" вариант, потому что она как раз предназначена для твоей задачи и ее не надо самому писать
Да. Скорее всего. Только вот, я сейчас уточнил. Одна база Оракловая другая Мускул.
Сорри за начальную дезинформацию.

З.Ы. Как тему переименовать?..
 
Сверху