Я использую следующий запрос, чтобы сохранить некоторые данные
INSERT INTO table (name,color,value) VALUES ('john','green','0,98')
Все поля имеют тип varchar и в случае дублирования ключа (скажем, john - это ключ) мой запрос должен измениться на
INSERT INTO table (name,color,value) VALUES ('john','green','0,98')
ON DUPLICATE KEY UPDATE value=CAST(value as DECIMAL(??)) + ?? ;
во втором примере я хочу, чтобы значение было значением + = (значение из таблицы) и сохраняло его как varchar, но я не знаю, как это настроить. Google не помог, я нашел несколько примеров здесь, но ничего не сработало, как я хочу.
Какие СУБД вы используете? Вот пример UPSERT для Postgres, который вы можете попробовать:
INSERT INTO mytable (name, color, value)
VALUES('john', 'green', CAST('0.98' AS DECIMAL(10,2)))
ON CONFLICT (name) DO UPDATE SET
value = mytable.value + CAST('0.98' AS DECIMAL(10,2))
;
Просто замените десятичную точность на то, что вам нужно, и введите правильные имена полей PK. Я не тестировал его, поэтому вам может понадобиться исправить синтаксис. Но это должно дать вам представление о том, как структурировать ваш запрос.
В MySQL вы можете:
INSERT INTO table (name, color, value)
VALUES ('john', 'green', '0,98')
ON DUPLICATE KEY UPDATE value = ( VALUES(value) + 0 )+ value;
Это работает следующим образом:
VALUES(value)
- это значение, передаваемое для обновления.+ 0
делает неявное преобразование в число.+ value
увеличивает существующее значение.MySQL будет преобразовывать это обратно в строку. Тем не менее, я настоятельно рекомендую вам не хранить номера в виде строк. SQL имеет соответствующие типы данных для хранения значений. Используй их.