LINUX.ORG.RU

Хитрый SQL (для MySQL)


0

0

Есть таблица

Name   Value
a      10
b      20
c      30

Вопрос: как можно написать запрос, что если мы добавляем уже 
существующий Name, то вместо INSERT делать Value += New_Value?
★★★★★

Т.е. для новой записи Name = d, Value = 10 делать INSERT

а для новой записи Name = a, Value = 20 делать UPDATE table SET Value=(a->Value) + New_Value

birdie ★★★★★
() автор топика
Ответ на: комментарий от birdie

Какой смысл дублировать данные в таблице? Почему бы не вынести Name и Value в отдельную таблицу, ведь Value зависит только от Name.

Tigger ★★★★★
()

В Informix подобную вещь я делал через:
... UNIQUE ... CONSTRAINT ...
и
START VIOLATIONS TABLE ...

То есть, загружаю данные, уникальные записываются
прямо в таблицу, а дубликаты - в violation-таблицу.
Затем в цикле перебираю данные из violation-таблицы
и делаю UPDATE по нужным полям.

В MySQL я такого не нашёл. Значит надо грузить
данные во временную таблицу и из неё в цикле
переносить данные в основную с проверкой уникальности.
Правда, это уже не чистый SQL.

Или вот такой вариант: на промежуточной таблице завести
триггер на INSERT, а он уже будет анализировать
введённые данные и переносить их в основную таблицу
INSERTом или UPDATEом.

lonki-lomki
()

А вариант делать выборку типа "SELECT Name, SUM(Value) FROM Table GROUP BY Name" и результаты запихивать в новую таблицу, после чего чистить старую ? Это конечно некошерно совсем, но, имхо, то, что ты хочешь сделать, простым запросом необстряпаешь. Хранимые процедуры помогут.

Anoxemian ★★★★★
()
Ответ на: комментарий от Anoxemian

Всем спасибо, придётся это запрограммировать - что, конечно, медленнее получится, чем на чистом SQL.

Насчёт хранимых процедур я подумаю.

birdie ★★★★★
() автор топика

А вот почему просто и надежно SELECT ... затем (INSERT ... | UPDATE...) не катит? Добавить транзакцию по вкусу.

anonymous
()

а просто послать два запроса не судьба ?
сначала update ignore, потом insert ignore ..
должно катить

anonymous
()

(могу ошибаться в деталях)

если mysql, создать unique index на колонку Name,

затем insert into table blah-bla on duplicate Value=Value+New_Value

пару дней назад делал аналогичное.. в других субд не пробовал.

waker ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.