-
Частенько появляется необходимость сделать UPDATE / INSERT в зависимости от наличия записи по PK.
То есть, существует набор полей. Их нужно записать в БД, причем если запись с такой ID есть - то обновить ее, если ее нету - то создать.
Кто как делает? Предварительный SELECT - потом по его результатам? Или сначала делаем INSERT, а в случае исключения делаем UPDATE?
Или это конкретно зависит от базы данных (например, в SQLite вроде никакого исключения не делается, если сделать INSERT с существующим PK, просто запись не вставится).
В частности, интересует SQLite и Firebird. Но также любопытно как это делают в других БД аля oracle / MSSQL.
P.S. Я так понимаю при рассмотрении вопрос переплетается с вариантами синхронизации баз данных. Это тоже интересно, как делается синхронизация, как БД узнает какие записи синхронизировать, чисто по полю "последнее время обновления" или еще как? Ну вкратце, чтобы ориентироваться, серьезно изучать вопрос пока не могу.
-
Хранимка ? c проверкой на exists ?
-
Я думаю так: если не понятно что делать insert или update - тут с логикой постоение что-то не так.
Что же до синхронизации - то планирую сделать явнфми флажками (или луче параллельной таблицей с тем же PK флажками "уже обновлено"). Флажки сбрасывать триггером в основной таблице при модификациях.
-
Можно еще поле завести. Логическое.
true - update, false - insert.
Например, если ты точно знаешь при вводе данных, существует такой ID в другой базе или нет.
-
> или луче параллельной таблицей с тем же PK флажками
или луче параллельной таблицей с тем же PK и флажками
-
> Кто как делает?
Хранимка с if exists
-
А вообще - согласен с
> Я думаю так: если не понятно что делать insert или update
> - тут с логикой постоение что-то не так.
-
if @Id > 0
update
else
insert
-
> clickmaker © (30.09.08 12:59) [7]
Ага, я такое постоянно использую. Но, как я понимаю, это не совсем то, что хочет автор...
-
-
-
> Добегался... (30.09.2008 12:38:00) [0]
Удалять можно, тогда DELETE + INSERT
-
> серьезно изучать вопрос пока не могу.
А стоит ли не серьезно его изучать? :)
-
> Удалять можно, тогда DELETE + INSERT
в чужом пхпэшном коде как-то наткнулся на такое. Долго думал, почему так, а не через update. Так и не додумался, переписал нафик )
-
> clickmaker © (30.09.08 13:42) [13]
> Так и не додумался, переписал нафик )
Работало?
"Ничего руками не трогай!" ©
-
-
в oracle используется merge
-
table1.first
while not eof do begin
i:=id
if locate(id, table2) then update else insert
table1.next
end;
:)))
зы: за синтаксис не пинайте...
-
Жаль MySQL нету в списке. Там это делается
REPLACE INTO
-
> [17]
Это как напильником пилить дерево...
какой уж там синтаксис....
-
>зы: за синтаксис не пинайте...
Будем пинать за логику, точнее за ее отсутствие. А также за абсолютно не рабочий код
:)
-
> Добегался... (30.09.08 12:38)
Я длоя этого написал мини ORM движок с наличием хелперов(динамическая вставка и обновление полей объекта в зависимости от изменения в них данных). Писал два дня, думал две недели...
-
Добегался... (30.09.08 12:38)
сначала делаем INSERT, а в случае исключения делаем UPDATE
1.Я так иногда делаю (MS SQL).
Anatoly Podgoretsky © (30.09.08 13:34) [11]
Удалять можно, тогда DELETE + INSERT
2.И такое тоже практикуется чаще, чем первый вариант. (MS SQL, MySQL).
-
> KygECHuK © (30.09.08 15:03) [19]
>
> > [17]
>
> Это как напильником пилить дерево...
Нахлынуло просто.
Dbase, Fox, Clipper...
Решать проблему тупо и в лоб!
-
> clickmaker (30.09.2008 13:42:13) [13]
update = DELETE + INSERT и по сути тоже. Только триггера мешаются, но в чистом SQL это именно так.
-
> в oracle используется merge
Включат в стандарт или хотя бы в реализацию сервера, то же будем, но по сути это извращение.
-
> update = DELETE + INSERT и по сути тоже.
Вах. Зависит от базы. Например на некторых Delete такая процедура, что лучше её не выполнять.
-
tesseract © (30.09.08 15:45) [26]
> Вах. Зависит от базы.
Ты можешь предложить другой способ ?
-
> tesseract © (30.09.08 15:45) [26]
> > update = DELETE + INSERT и по сути тоже.
> Вах. Зависит от базы.
>
> Игорь Шевченко © (30.09.08 15:50) [27]
> Ты можешь предложить другой способ ?
Игорь, а что замена значения полей равно delete+insert?
Для значения - да. Для записи - таки нет!
-
> tesseract (30.09.2008 15:45:26) [26]
А я оговорил "если можно", но это потому, что производители SQL серверов извратили суть SQL
В теории это одно и тоже.
-
> Игорь, а что замена значения полей равно delete+insert?
Может и такое быть. Но страничные, как правило хитрее работают. При update в транзакции, создать новую запись и пометить область, как свободную - самый нажёдный и быстрый способ. Версионники так ,скорее всего, делают в любом случае.
-
> Игорь, а что замена значения полей равно delete+insert?
В большинстве случаев да. Потому что при замене значений полей заменяется запись целиком
-
> замена значения полей равно delete+insert?
а ID записи?
-
> Vlad Oshin (30.09.2008 17:47:32) [32]
А что ИД записи?
-
> Anatoly Podgoretsky © (30.09.08 19:42) [33]
ИД записи поменяется (хотя не знаю, кому это принципиально).
-
Удалено модератором
-
> Раиса © (30.09.08 20:11) [34]
> ИД записи поменяется
Это про какой сервер речь?
-
Удалено модератором
-
> Раиса (30.09.2008 20:11:34) [34]
Зачем тогда выбраны изменяемые ИД, если важна их неизмеяемость?
-
Мы с Тамарой ходим парой.