Требуется проверить существует ли запись. Если ее нету то добавить запись с толькочто поступившими данными, если запись есть, то прибавить в ней значение.
Пример:
// 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 запроса или есть более простые способы?
>Требуется проверить существует ли запись. Если ее нету то добавить запись с
>толькочто поступившими данными, если запись есть, то прибавить в ней значение.
>
>Пример:
>// 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
>
>
>использузйте оператор CASE
хм.. а можно какойнибуть пример?
>Требуется проверить существует ли запись. Если ее нету то добавить запись с
>толькочто поступившими данными, если запись есть, то прибавить в ней значение.
>
>Пример:
>// 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 есть оператор REPLACE. Если записи нет, то делает INSERT, если
>есть, то делает UPDATE.Насколько я понял REPLACE не делает update, она просто заменяет. REPLACE не предоставляет доступа к замещаемой записи, значит все равно придется сделать в начале select чтобы получить значение n, затем суммировать его и потом записать. Т.е. в REPLACE запись n=n+15 не прокатит.
>Насколько я понял 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
Дополнение:
Cамо сабой, поле по которому мы ищем дубликат должно быть UNIQUE (ну или PRIMARY) KEY.
>Дополнение:
>Cамо сабой, поле по которому мы ищем дубликат должно быть UNIQUE (ну
>или PRIMARY) KEY.Вот это то что нужно, спасибо :)
Есть только одна не большая проблемка:
Уникальных столбцев нет, но уникальность есть в совокупности нескольких столбцев, например - year, month, day, hour. Думаю добавить в таблицу еще один столбец UNIQUE, который будет содержать стороку типа "year-month-day-hour" он и будет уникальным.
>>Дополнение:
>>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)
)