URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5859
[ Назад ]

Исходное сообщение
"Mysql 4.0 Условие: update или insert"

Отправлено Васька , 30-Окт-06 07:05 
Требуется проверить существует ли запись. Если ее нету то добавить запись с толькочто поступившими данными, если запись есть, то прибавить в ней значение.
Пример:
// n = 15
// проверить существует ли запись
select * from t where hour=12;

// если записи нет то:
insert into t (n,hour) values (15,12);

// если запись есть
update t set n=n+15 where hour=12;

Обезательно выполнять такую операцию в 2 запроса или есть более простые способы?


Содержание

Сообщения в этом обсуждении
"Mysql 4.0 Условие: update или insert"
Отправлено Romik , 30-Окт-06 09:45 
>Требуется проверить существует ли запись. Если ее нету то добавить запись с
>толькочто поступившими данными, если запись есть, то прибавить в ней значение.
>
>Пример:
>// n = 15
>// проверить существует ли запись
>select * from t where hour=12;
>
>// если записи нет то:
>insert into t (n,hour) values (15,12);
>
>// если запись есть
>update t set n=n+15 where hour=12;
>
>Обезательно выполнять такую операцию в 2 запроса или есть более простые способы?
>


использузйте оператор CASE


"Mysql 4.0 Условие: update или insert"
Отправлено Васька , 30-Окт-06 11:46 
>
>
>использузйте оператор CASE


хм.. а можно какойнибуть пример?


"Mysql 4.0 Условие: update или insert"
Отправлено Richi , 30-Окт-06 12:29 
>Требуется проверить существует ли запись. Если ее нету то добавить запись с
>толькочто поступившими данными, если запись есть, то прибавить в ней значение.
>
>Пример:
>// n = 15
>// проверить существует ли запись
>select * from t where hour=12;
>
>// если записи нет то:
>insert into t (n,hour) values (15,12);
>
>// если запись есть
>update t set n=n+15 where hour=12;
>
>Обезательно выполнять такую операцию в 2 запроса или есть более простые способы?
>

В MySQL есть оператор REPLACE. Если записи нет, то делает INSERT, если есть, то делает UPDATE.


"Mysql 4.0 Условие: update или insert"
Отправлено Васька , 30-Окт-06 12:51 

>
>В MySQL есть оператор REPLACE. Если записи нет, то делает INSERT, если
>есть, то делает UPDATE.

Насколько я понял REPLACE не делает update, она просто заменяет. REPLACE не предоставляет доступа к замещаемой записи, значит все равно придется сделать в начале select чтобы получить значение n, затем суммировать его и потом записать. Т.е. в REPLACE запись n=n+15 не прокатит.


"Mysql 4.0 Условие: update или insert"
Отправлено Dreid , 02-Ноя-06 15:34 
>Насколько я понял REPLACE не делает update, она просто заменяет. REPLACE не
>предоставляет доступа к замещаемой записи, значит все равно придется сделать в
>начале select чтобы получить значение n, затем суммировать его и потом
>записать. Т.е. в REPLACE запись n=n+15 не прокатит.

А вот такое?

(Взято из http://mysql.org/doc/refman/4.1/en/insert-on-duplicate.html)

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

Там документация не разделяет 4.0 и 4.1, так что я не могу сказать, есть ли это в 4.0


"Mysql 4.0 Условие: update или insert"
Отправлено Dreid , 02-Ноя-06 19:05 
Дополнение:
Cамо сабой, поле по которому мы ищем дубликат должно быть UNIQUE (ну или PRIMARY) KEY.

"Mysql 4.0 Условие: update или insert"
Отправлено Васька , 03-Ноя-06 14:49 
>Дополнение:
>Cамо сабой, поле по которому мы ищем дубликат должно быть UNIQUE (ну
>или PRIMARY) KEY.

Вот это то что нужно, спасибо :)

Есть только одна не большая проблемка:
Уникальных столбцев нет, но уникальность есть в совокупности нескольких столбцев, например - year, month, day, hour. Думаю добавить в таблицу еще один столбец UNIQUE, который будет содержать стороку типа "year-month-day-hour" он и будет уникальным.


"Mysql 4.0 Условие: update или insert"
Отправлено elvenic , 03-Ноя-06 18:35 
>>Дополнение:
>>Cамо сабой, поле по которому мы ищем дубликат должно быть UNIQUE (ну
>>или PRIMARY) KEY.
>
>Вот это то что нужно, спасибо :)
>
>Есть только одна не большая проблемка:
>Уникальных столбцев нет, но уникальность есть в совокупности нескольких столбцев, например -
>year, month, day, hour. Думаю добавить в таблицу еще один столбец
>UNIQUE, который будет содержать стороку типа "year-month-day-hour" он и будет уникальным.

Да нет, не надо так делать. Надо создать primary key (или unique) по всем этим полям:

    create table T (
        year integer,
        month integer,
        day inteer,
        hour integer,
        ...
        primary key (year, month, day, hour)
    )