Запрос к БД - новые записи

kreator

Создатель
Заблокирован
Регистрация
18 Июн 2011
Сообщения
113
Реакции
6
  • Автор темы
  • Заблокирован
  • #1
Прошу подсказки.
Суть следующая - есть 2 сайта.
Нужно чтоб скрипт проверял в БД первого сайта новые записи, и если таковые есть записывал их в БД второго сайта.
Как составить сами запросы я понимают, но не понятно другое - новая там запись или нет ...
(чтоб скрипт не копировал одно и тоже по 2 раза)
 
новые - относительно какого-то момента(времени) - сравнивать по колонке time, т.е. по времени добавления записи
 
  • Автор темы
  • Заблокирован
  • #3
не вариант, думаю ... а вдруг несколько записей выйдут в небольшой промежуток времени ...
 
кури маны... есть такие штуковины как триггеры... смотри в сторону after insert
 
Самый простой вариант, это добавить поле флаг.
то есть например нужно узнать копировалось поле или нет. Для этого в таблицу добавляем поле new_post у которого будет 2 значения 0 и 1.
Если 0, значит его нет на втором сайте. Переносим его и отмечаем как 1.
Собственно это можно сделать 2х сторонне, на обеих сайтах... даже больше.
Иначе никак...
Можно конечно написать более сложный скрипт сравнения постов и т.п. Но это геморно будет.
И если база будет огромной, то ещё и долго... что может вызвать проблемы с временем выполнения скрипта на серверах...
 
cruide правильно говорит, только на втором сайте незачем это реализовывать. На первом при каждом инсерте записываешь ноль в поле флаг.
помимо этого делаешь пхп скрипт с подключением к обоим бд, внутри функция, которая делает селект из первой базы с условием отбора ноль в поле флага, потом foreach для каждой записи из выборки и внутри него инсерт во вторую базу.
чтобы скрипт работал регулярно нужно настроить планировщик, cron, например
могу скинуть пример синхронизации баз данных
 
поздно уже наверное отвечать, но мастер-мастер репликация поможет
 
Самый простой способ:
insert into DB2_SomeTable
filed1,
field2,
...
fieldN
from (
select * from DB1_SomeTable where DB2_SomeTable.id < max( select id from DB1_Sometable)
)

понятное дело такой запрос работать не будет, но суть отражает. Если в БД только добавляются данные, значит по первичному ключу (обычно ID) вполне можно понять какие записи отсутствуют.

эх, решил-таки написать полностью :)

Код:
#!/bin/bash
echo 'SELECT max(`id`) FROM `имя таблицы в БД в которую надо записать данные`' > sql1.sql
echo 'SELECT * FROM `имя таблицы из которой будем читать данные` WHERE `id` < ' > sql2.sql

mysql -h ХостБДВКоторуюПисать -u ПользовательБДВКоторуюПисать --password=Пароль БДВКоторуюПисать -N < sql1.sql >> sql2.sql

mysql -h ХостьБДИзКоторойЧитать -u ПользовательБДИзКоторойЧитать --password=Пароль БДИзКоторойЧитать -N < sql2.sql | awk '{ print "INSERT INTO `table` VALUES(",$1,$2,$3...сколько полей в бд, столько переменных $N...");" }' > sql3.sql

mysql -h ХостБДВКоторуюПисать -u ПользовательБДВКоторуюПисать --password=Пароль БДВКоторуюПисать < sql3.sql
 
С временем нормальный вариант был.
Например пишем в каждую запись переменную UNIX_TIMESTAMP(NOW()) , с миллисекундами. она и будет ключевой. Кто страдает паранойем, может перед записью сравнивать эту же переменную с такой же из предыдущей записи. mysql всё равно приличную запись не успеет за миллисекунду записать, не говоря о том что серверу нужно еще сам скрипт выполнить.
 
Тогда если пользовать UNIX_TIME как ключевое поле, то целесообразней пользовать не INSERT, а REPLACE.
 
Назад
Сверху