Конференция "Прочее" » UPDATE / INSERT в одном флаконе
 
  • Добегался... (30.09.08 12:38) [0]
    Частенько появляется необходимость сделать UPDATE / INSERT в зависимости от наличия записи по PK.

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

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

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

    P.S. Я так понимаю при рассмотрении вопрос переплетается с вариантами синхронизации баз данных. Это тоже интересно, как делается синхронизация, как БД узнает какие записи синхронизировать, чисто по полю "последнее время обновления" или еще как? Ну вкратце, чтобы ориентироваться, серьезно изучать вопрос пока не могу.
  • tesseract © (30.09.08 12:53) [1]
    Хранимка ? c проверкой на exists ?
  • KSergey © (30.09.08 12:54) [2]
    Я думаю так: если не понятно что делать insert или update - тут с логикой постоение что-то не так.
    Что же до синхронизации - то планирую сделать явнфми флажками (или луче параллельной таблицей с тем же PK флажками "уже обновлено"). Флажки сбрасывать триггером в основной таблице при модификациях.
  • oldman © (30.09.08 12:54) [3]
    Можно еще поле завести. Логическое.
    true - update, false - insert.

    Например, если ты точно знаешь при вводе данных, существует такой ID в другой базе или нет.
  • KSergey © (30.09.08 12:55) [4]
    > или луче параллельной таблицей с тем же PK флажками

    или луче параллельной таблицей с тем же PK и флажками
  • Ega23 © (30.09.08 12:57) [5]

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


    Хранимка с if exists
  • Ega23 © (30.09.08 12:57) [6]
    А вообще - согласен с

    > Я думаю так: если не понятно что делать insert или update
    > - тут с логикой постоение что-то не так.
  • clickmaker © (30.09.08 12:59) [7]
    if @Id > 0
     update
    else
     insert
  • Ega23 © (30.09.08 13:00) [8]

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


    Ага, я такое постоянно использую. Но, как я понимаю, это не совсем то, что хочет автор...
  • Polevi © (30.09.08 13:04) [9]
  • Johnmen © (30.09.08 13:12) [10]
  • Anatoly Podgoretsky © (30.09.08 13:34) [11]
    > Добегался...  (30.09.2008 12:38:00)  [0]

    Удалять можно, тогда DELETE + INSERT
  • b z (30.09.08 13:40) [12]

    > серьезно изучать вопрос пока не могу.
    А стоит ли не серьезно его изучать? :)
  • clickmaker © (30.09.08 13:42) [13]
    > Удалять можно, тогда DELETE + INSERT

    в чужом пхпэшном коде как-то наткнулся на такое. Долго думал, почему так, а не через update. Так и не додумался, переписал нафик )
  • oldman © (30.09.08 13:46) [14]

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


    Работало?
    "Ничего руками не трогай!" ©
  • GlFox © (30.09.08 14:09) [15]
    Делаю так:
    update or insert into Table1(ID,NAME) values(?,?)


    Читаю здесь: http://www.firebirdsql.org/rlsnotesh/rlsnotes210.html#rnfb210-updorinsrt
  • Игорь Шевченко © (30.09.08 14:42) [16]
    в oracle используется merge
  • oldman © (30.09.08 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 © (30.09.08 14:59) [18]
    Жаль MySQL нету в списке. Там это делается
    REPLACE INTO
  • KygECHuK © (30.09.08 15:03) [19]

    > [17]

    Это как напильником пилить дерево...
    какой уж там синтаксис....
  • MsGuns © (30.09.08 15:04) [20]
    >зы: за синтаксис не пинайте...

    Будем пинать за логику, точнее за ее отсутствие. А также за абсолютно не рабочий код
    :)
  • Городской Шаман (30.09.08 15:10) [21]

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


    Я длоя этого написал мини ORM движок с наличием хелперов(динамическая вставка и обновление полей объекта в зависимости от изменения в них данных). Писал два дня, думал две недели...
  • Раиса © (30.09.08 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 © (30.09.08 15:22) [23]

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


    Нахлынуло просто.
    Dbase, Fox, Clipper...
    Решать проблему тупо и в лоб!
  • Anatoly Podgoretsky © (30.09.08 15:29) [24]
    > clickmaker  (30.09.2008 13:42:13)  [13]

    update = DELETE + INSERT и по сути тоже. Только триггера мешаются, но в чистом SQL это именно так.
  • Anatoly Podgoretsky © (30.09.08 15:31) [25]

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

    Включат в стандарт или хотя бы в реализацию сервера, то же будем, но по сути это извращение.
  • tesseract © (30.09.08 15:45) [26]

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


    Вах. Зависит от базы. Например на некторых Delete такая процедура, что лучше её не выполнять.
  • Игорь Шевченко © (30.09.08 15:50) [27]
    tesseract ©   (30.09.08 15:45) [26]


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


    Ты можешь предложить другой способ ?
  • oldman © (30.09.08 15:55) [28]

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


    Игорь, а что замена значения полей равно delete+insert?
    Для значения - да. Для записи - таки нет!
  • Anatoly Podgoretsky © (30.09.08 16:27) [29]
    > tesseract  (30.09.2008 15:45:26)  [26]

    А я оговорил "если можно", но это потому, что производители SQL серверов извратили суть SQL
    В теории это одно и тоже.
  • tesseract © (30.09.08 16:39) [30]

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


    Может и такое быть. Но страничные, как правило хитрее работают. При update в транзакции, создать новую запись и пометить область, как свободную - самый нажёдный и быстрый способ. Версионники так ,скорее всего, делают в любом случае.
  • Игорь Шевченко © (30.09.08 17:39) [31]

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


    В большинстве случаев да. Потому что при замене значений полей заменяется запись целиком
  • Vlad Oshin © (30.09.08 17:47) [32]

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

    а ID записи?
  • Anatoly Podgoretsky © (30.09.08 19:42) [33]
    > Vlad Oshin  (30.09.2008 17:47:32)  [32]

    А что ИД записи?
  • Раиса © (30.09.08 20:11) [34]

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


    ИД записи поменяется (хотя не знаю, кому это принципиально).
  • Раиса © (30.09.08 20:11) [35]
    Удалено модератором
  • Johnmen © (30.09.08 20:40) [36]

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

    Это про какой сервер речь?
  • Johnmen © (30.09.08 20:40) [37]
    Удалено модератором
  • Anatoly Podgoretsky © (30.09.08 21:01) [38]
    > Раиса  (30.09.2008 20:11:34)  [34]

    Зачем тогда выбраны изменяемые ИД, если важна их неизмеяемость?
  • Anatoly Podgoretsky © (30.09.08 21:02) [39]
    Мы с Тамарой ходим парой.
 
Конференция "Прочее" » UPDATE / INSERT в одном флаконе
Есть новые Нет новых   [134444   +22][b:0.001][p:0.002]