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

Тема в разделе "Как сделать...", создана пользователем kreator, 2 авг 2012.

  1. kreator

    kreator Создатель

    Заблокирован
    Регистр.:
    18 июн 2011
    Сообщения:
    113
    Симпатии:
    6
    Прошу подсказки.
    Суть следующая - есть 2 сайта.
    Нужно чтоб скрипт проверял в БД первого сайта новые записи, и если таковые есть записывал их в БД второго сайта.
    Как составить сами запросы я понимают, но не понятно другое - новая там запись или нет ...
    (чтоб скрипт не копировал одно и тоже по 2 раза)
     
  2. PapaJoe

    PapaJoe

    Регистр.:
    4 авг 2008
    Сообщения:
    620
    Симпатии:
    311
    новые - относительно какого-то момента(времени) - сравнивать по колонке time, т.е. по времени добавления записи
     
  3. kreator

    kreator Создатель

    Заблокирован
    Регистр.:
    18 июн 2011
    Сообщения:
    113
    Симпатии:
    6
    не вариант, думаю ... а вдруг несколько записей выйдут в небольшой промежуток времени ...
     
  4. stealthdebuger

    stealthdebuger Механик

    Administrator
    Регистр.:
    25 авг 2008
    Сообщения:
    628
    Симпатии:
    1.388
    кури маны... есть такие штуковины как триггеры... смотри в сторону after insert
     
    Шумадан нравится это.
  5. cruide

    cruide Писатель

    Регистр.:
    25 июл 2012
    Сообщения:
    8
    Симпатии:
    22
    Самый простой вариант, это добавить поле флаг.
    то есть например нужно узнать копировалось поле или нет. Для этого в таблицу добавляем поле new_post у которого будет 2 значения 0 и 1.
    Если 0, значит его нет на втором сайте. Переносим его и отмечаем как 1.
    Собственно это можно сделать 2х сторонне, на обеих сайтах... даже больше.
    Иначе никак...
    Можно конечно написать более сложный скрипт сравнения постов и т.п. Но это геморно будет.
    И если база будет огромной, то ещё и долго... что может вызвать проблемы с временем выполнения скрипта на серверах...
     
  6. tero

    tero Писатель

    Регистр.:
    17 июн 2012
    Сообщения:
    2
    Симпатии:
    0
    cruide правильно говорит, только на втором сайте незачем это реализовывать. На первом при каждом инсерте записываешь ноль в поле флаг.
    помимо этого делаешь пхп скрипт с подключением к обоим бд, внутри функция, которая делает селект из первой базы с условием отбора ноль в поле флага, потом foreach для каждой записи из выборки и внутри него инсерт во вторую базу.
    чтобы скрипт работал регулярно нужно настроить планировщик, cron, например
    могу скинуть пример синхронизации баз данных
     
  7. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.725
    Симпатии:
    2.100
    поздно уже наверное отвечать, но мастер-мастер репликация поможет
     
  8. dikoy

    dikoy Создатель

    Регистр.:
    16 фев 2012
    Сообщения:
    11
    Симпатии:
    4
    Самый простой способ:
    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
    
     
  9. Maverik

    Maverik Писатель

    Регистр.:
    30 сен 2013
    Сообщения:
    8
    Симпатии:
    0
    С временем нормальный вариант был.
    Например пишем в каждую запись переменную UNIX_TIMESTAMP(NOW()) , с миллисекундами. она и будет ключевой. Кто страдает паранойем, может перед записью сравнивать эту же переменную с такой же из предыдущей записи. mysql всё равно приличную запись не успеет за миллисекунду записать, не говоря о том что серверу нужно еще сам скрипт выполнить.
     
  10. cruide

    cruide Писатель

    Регистр.:
    25 июл 2012
    Сообщения:
    8
    Симпатии:
    22
    Тогда если пользовать UNIX_TIME как ключевое поле, то целесообразней пользовать не INSERT, а REPLACE.