Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как обновить данные в таблице БД?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Exponat
Отправлено: 11 Сентября, 2015 - 15:44:32
Post Id



Частый гость


Покинул форум
Сообщений всего: 196
Дата рег-ции: Янв. 2013  


Помог: 0 раз(а)




Есть таблица такого вида:
ID NAME STREET HOUSE LIMITWEIGHT
1 Зачепиловка Свердлова 21 30
2 Дымер Ленина 3 30

Каким запросом мне обновить данные в этой таблице? Если данные которые обновляются отсутствуют - то чтоб они добавились. А если в каких то данных поменялось одно значение - то чтоб оно перезаписалось. Это возможно?
 
 Top
Мелкий Супермодератор
Отправлено: 11 Сентября, 2015 - 16:11:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Возможно, конечно. Вопрос в том, сколько и чего для этого надо делать.
upsert/merge/ON CONFLICT/on duplicate key/replace как простой случай и со своими тараканами. И не предполагают что-то делать с записями, которых больше нет в новом наборе данных.

Более многословный способ, но более гибкий:
begin
create temporary table temptable ON COMMIT DROP
insert в эту временную таблицу всех новых значений
create index on tempname по полям, по которым будем сравнивать

delete from tablename записей, которых нет в новой таблице (ну или апдейт)
insert into tablename .. select from temptable для записей, к которым не нашлось пар в старой таблице
update с inner join'ом для записей. которые есть и там и там
Можно делать в одном cte. Эффективнее ли not exists, left join или один общий full outer join - это надо смотреть на конкретном примере с конкретной базой.
drop temporary table, если ваша субд не умеет on commit drop или его аналог.
commit;


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB