Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2015, 17:19   #1
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,152
По умолчанию SQLite - изменить, если записи разные, а если нету, то вставить

Есть таблица:
Код:
CREATE TABLE tbl_teams (            
    id integer  primary key, 
    team_id varchar(80), 
    team_title varchar(80), 
    team_city varchar(80)
)
С сервера приходит какой-то актуальный список:

Код:
{
    "teams":[
    {
            "team_id":678,
            "title":"Red Heads",
            "town":"Moscow"
    },
    {
            "team_id":90,
            "title":"Blue Hands",
            "town":"Baghdad"
    },
    {
            "team_id":128,
            "title":"White Tails",
            "town":"Paris"
    }
    ]}
Как привести таблицу к актуальному состоянию? Т.е. team_id - гарантированно уникальное, а название и город может меняться. Также команды могут как добавляться, так и удаляться.

То есть что-то типа такого алгоритма на псевдо коде:

Код:
IF (team_id_table == team_id_new) 
THEN 
{ 
    IF (title_table != title_new OR town_table != town_new) // данные по командам отличаются - замена
    THEN REPLACE
} 
ELSEIF (team_id_table != team_id_new) // новой команды нету - вставка
   THEN INSERT
ELSEIF ( team_id_new != team_id_table) // старой команды нету - удаление
   THEN REMOVE
INSERT OR REPLACE канеш работает, но это абсолютно идентично полной очистке таблицы и ее заполнению наново. Оптимальность, кароч, нужна, чтоб диск не теребить, ибо команд много, а добавляются или изменяются редко)

Наверняка можно как-то по-красивому выкрутиться, но уровень моего пониманя скуля - SELECT FROM и не больше(
Smogg вне форума Ответить с цитированием
Старый 09.10.2015, 18:29   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код:
UPDATE tbl_teams
  SET team_title=(SELECT title FROM NewTable WHERE NewTable.team_id=tbl_teams.team_id),
      team_city=(SELECT town FROM NewTable WHERE NewTable.team_id=tbl_teams.team_id)
  WHERE EXISTS(SELECT *
                 FROM NewTable
                 WHERE NewTable.team_id=tbl_teams.team_id and
                       (NewTable.title<>tbl_teams.team_title or
                        NewTable.town<>tbl_teams.team_city))

INSERT INTO tbl_teams (team_id,team_title,team_city)
  SELECT team_id,title,town
    FROM NewTable
    WHERE NOT EXISTS(SELECT * FROM tbl_teams WHERE NewTable.team_id=tbl_teams.team_id)
Не факт, что оптимальней REPLACE будет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.10.2015, 20:49   #3
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,152
По умолчанию

Вай! Спасибо! Теперь все понятно))))

Хм, тогда желательно будет объявить team_id как UNIQUE. Справка обещает ускорение.

Последний раз редактировалось Smogg; 09.10.2015 в 20:54.
Smogg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как знать начало программы, функцию запуска?Если нету main() jei_ Visual C++ 4 01.02.2015 12:55
Ввести число. Если оно положительное, найти его квадратный корень. Если отрицательное - возвести в квадратВвести число. Если оно п FYNZIK Паскаль, Turbo Pascal, PascalABC.NET 1 18.02.2014 16:29
Как на нетбук установить систему если нету куда пихнуть диск? Abuhamed Компьютерное железо 3 05.02.2012 21:53
Вставка строки в том случае, если такой нету Mixasik SQL, базы данных 3 11.04.2010 19:00
Если нету Flash то IMG!?!?!?! DRUG_ADDICT HTML и CSS 5 27.02.2008 01:23