Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.12.28;
Скачать: [xml.tar.bz2];

Вниз

UPDATE / INSERT в одном флаконе   Найти похожие ветки 

 
Добегался...   (2008-09-30 12:38) [0]

Частенько появляется необходимость сделать UPDATE / INSERT в зависимости от наличия записи по PK.

То есть, существует набор полей. Их нужно записать в БД, причем если запись с такой ID есть - то обновить ее, если ее нету - то создать.

Кто как делает? Предварительный SELECT - потом по его результатам? Или сначала делаем INSERT, а в случае исключения делаем UPDATE?
Или это конкретно зависит от базы данных (например, в SQLite вроде никакого исключения не делается, если сделать INSERT с существующим PK, просто запись не вставится).

В частности, интересует SQLite и Firebird. Но также любопытно как это делают в других БД аля oracle / MSSQL.

P.S. Я так понимаю при рассмотрении вопрос переплетается с вариантами синхронизации баз данных. Это тоже интересно, как делается синхронизация, как БД узнает какие записи синхронизировать, чисто по полю "последнее время обновления" или еще как? Ну вкратце, чтобы ориентироваться, серьезно изучать вопрос пока не могу.


 
tesseract ©   (2008-09-30 12:53) [1]

Хранимка ? c проверкой на exists ?


 
KSergey ©   (2008-09-30 12:54) [2]

Я думаю так: если не понятно что делать insert или update - тут с логикой постоение что-то не так.
Что же до синхронизации - то планирую сделать явнфми флажками (или луче параллельной таблицей с тем же PK флажками "уже обновлено"). Флажки сбрасывать триггером в основной таблице при модификациях.


 
oldman ©   (2008-09-30 12:54) [3]

Можно еще поле завести. Логическое.
true - update, false - insert.

Например, если ты точно знаешь при вводе данных, существует такой ID в другой базе или нет.


 
KSergey ©   (2008-09-30 12:55) [4]

> или луче параллельной таблицей с тем же PK флажками

или луче параллельной таблицей с тем же PK и флажками


 
Ega23 ©   (2008-09-30 12:57) [5]


> Кто как делает?


Хранимка с if exists


 
Ega23 ©   (2008-09-30 12:57) [6]

А вообще - согласен с

> Я думаю так: если не понятно что делать insert или update
> - тут с логикой постоение что-то не так.


 
clickmaker ©   (2008-09-30 12:59) [7]

if @Id > 0
 update
else
 insert


 
Ega23 ©   (2008-09-30 13:00) [8]


> clickmaker ©   (30.09.08 12:59) [7]


Ага, я такое постоянно использую. Но, как я понимаю, это не совсем то, что хочет автор...


 
Polevi ©   (2008-09-30 13:04) [9]

http://msdn.microsoft.com/en-us/library/bb510625.aspx


 
Johnmen ©   (2008-09-30 13:12) [10]

http://www.ibase.ru/devinfo/testiu.htm


 
Anatoly Podgoretsky ©   (2008-09-30 13:34) [11]

> Добегался...  (30.09.2008 12:38:00)  [0]

Удалять можно, тогда DELETE + INSERT


 
b z   (2008-09-30 13:40) [12]


> серьезно изучать вопрос пока не могу.
А стоит ли не серьезно его изучать? :)


 
clickmaker ©   (2008-09-30 13:42) [13]

> Удалять можно, тогда DELETE + INSERT

в чужом пхпэшном коде как-то наткнулся на такое. Долго думал, почему так, а не через update. Так и не додумался, переписал нафик )


 
oldman ©   (2008-09-30 13:46) [14]


> clickmaker ©   (30.09.08 13:42) [13]
>  Так и не додумался, переписал нафик )


Работало?
"Ничего руками не трогай!" ©


 
GlFox ©   (2008-09-30 14:09) [15]

Делаю так:update or insert into Table1(ID,NAME) values(?,?)
Читаю здесь: http://www.firebirdsql.org/rlsnotesh/rlsnotes210.html#rnfb210-updorinsrt


 
Игорь Шевченко ©   (2008-09-30 14:42) [16]

в oracle используется merge


 
oldman ©   (2008-09-30 14:47) [17]

table1.first
while not eof do begin
 i:=id
 if locate(id, table2) then update else insert
 table1.next
end;

:)))
зы: за синтаксис не пинайте...


 
Dmitry S ©   (2008-09-30 14:59) [18]

Жаль MySQL нету в списке. Там это делается
REPLACE INTO


 
KygECHuK ©   (2008-09-30 15:03) [19]


> [17]

Это как напильником пилить дерево...
какой уж там синтаксис....


 
MsGuns ©   (2008-09-30 15:04) [20]

>зы: за синтаксис не пинайте...

Будем пинать за логику, точнее за ее отсутствие. А также за абсолютно не рабочий код
:)


 
Городской Шаман   (2008-09-30 15:10) [21]


> Добегался...   (30.09.08 12:38)  


Я длоя этого написал мини ORM движок с наличием хелперов(динамическая вставка и обновление полей объекта в зависимости от изменения в них данных). Писал два дня, думал две недели...


 
Раиса ©   (2008-09-30 15:18) [22]

Добегался...   (30.09.08 12:38)  
сначала делаем INSERT, а в случае исключения делаем UPDATE

1.Я так иногда делаю (MS SQL).

Anatoly Podgoretsky ©   (30.09.08 13:34) [11]
Удалять можно, тогда DELETE + INSERT


2.И такое тоже практикуется чаще, чем первый вариант. (MS SQL, MySQL).


 
oldman ©   (2008-09-30 15:22) [23]


> KygECHuK ©   (30.09.08 15:03) [19]
>
> > [17]
>
> Это как напильником пилить дерево...


Нахлынуло просто.
Dbase, Fox, Clipper...
Решать проблему тупо и в лоб!


 
Anatoly Podgoretsky ©   (2008-09-30 15:29) [24]

> clickmaker  (30.09.2008 13:42:13)  [13]

update = DELETE + INSERT и по сути тоже. Только триггера мешаются, но в чистом SQL это именно так.


 
Anatoly Podgoretsky ©   (2008-09-30 15:31) [25]


> в oracle используется merge

Включат в стандарт или хотя бы в реализацию сервера, то же будем, но по сути это извращение.


 
tesseract ©   (2008-09-30 15:45) [26]


> update = DELETE + INSERT и по сути тоже.


Вах. Зависит от базы. Например на некторых Delete такая процедура, что лучше её не выполнять.


 
Игорь Шевченко ©   (2008-09-30 15:50) [27]

tesseract ©   (30.09.08 15:45) [26]


> Вах. Зависит от базы.


Ты можешь предложить другой способ ?


 
oldman ©   (2008-09-30 15:55) [28]


> tesseract ©   (30.09.08 15:45) [26]
> > update = DELETE + INSERT и по сути тоже.
> Вах. Зависит от базы.
>
> Игорь Шевченко ©   (30.09.08 15:50) [27]
> Ты можешь предложить другой способ ?


Игорь, а что замена значения полей равно delete+insert?
Для значения - да. Для записи - таки нет!


 
Anatoly Podgoretsky ©   (2008-09-30 16:27) [29]

> tesseract  (30.09.2008 15:45:26)  [26]

А я оговорил "если можно", но это потому, что производители SQL серверов извратили суть SQL
В теории это одно и тоже.


 
tesseract ©   (2008-09-30 16:39) [30]


> Игорь, а что замена значения полей равно delete+insert?


Может и такое быть. Но страничные, как правило хитрее работают. При update в транзакции, создать новую запись и пометить область, как свободную - самый нажёдный и быстрый способ. Версионники так ,скорее всего, делают в любом случае.


 
Игорь Шевченко ©   (2008-09-30 17:39) [31]


> Игорь, а что замена значения полей равно delete+insert?


В большинстве случаев да. Потому что при замене значений полей заменяется запись целиком


 
Vlad Oshin ©   (2008-09-30 17:47) [32]


>  замена значения полей равно delete+insert?

а ID записи?


 
Anatoly Podgoretsky ©   (2008-09-30 19:42) [33]

> Vlad Oshin  (30.09.2008 17:47:32)  [32]

А что ИД записи?


 
Раиса ©   (2008-09-30 20:11) [34]


> Anatoly Podgoretsky ©   (30.09.08 19:42) [33]


ИД записи поменяется (хотя не знаю, кому это принципиально).


 
Раиса ©   (2008-09-30 20:11) [35]

Удалено модератором


 
Johnmen ©   (2008-09-30 20:40) [36]


> Раиса ©   (30.09.08 20:11) [34]
> ИД записи поменяется

Это про какой сервер речь?


 
Johnmen ©   (2008-09-30 20:40) [37]

Удалено модератором


 
Anatoly Podgoretsky ©   (2008-09-30 21:01) [38]

> Раиса  (30.09.2008 20:11:34)  [34]

Зачем тогда выбраны изменяемые ИД, если важна их неизмеяемость?


 
Anatoly Podgoretsky ©   (2008-09-30 21:02) [39]

Мы с Тамарой ходим парой.


 
Добежал   (2008-10-27 11:01) [40]

>Делаю так:update or insert into Table1(ID,NAME) values(?,?)

а по какому условию тогда сработает update?!



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2008.12.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.006 c
3-1212217646
Dron2
2008-05-31 11:07
2008.12.28
Сложение текстовых полей в запросе


2-1227094803
Golden
2008-11-19 14:40
2008.12.28
Вопросик по StringReplace


2-1226579779
Andrey_ka
2008-11-13 15:36
2008.12.28
как определить высоту mainmenu?


3-1212327199
Сашик
2008-06-01 17:33
2008.12.28
Recordset.Close


2-1227075251
Jack
2008-11-19 09:14
2008.12.28
Вырезать строку из буфера





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский