Конференция "Прочее" » 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]

    Это как напильником пилить дерево...
    какой уж там синтаксис....
 
Конференция "Прочее" » UPDATE / INSERT в одном флаконе
Есть новые Нет новых   [134444   +22][b:0][p:0.001]