Одношаговый ответ на первый вопрос - использовать что-то вроде:
update TBL set CLM = CLM + 1 where key = 'KEY'
Это очень простой способ сделать это.
Что касается второго вопроса, вам не нужно прибегать к специфической для СУБД гимнастике SQL (например, UPSERT
), чтобы получить нужный результат. Существует стандартный метод обновления или вставки, который не требует конкретной СУБД.
try:
insert into TBL (key,val) values ('xyz',0)
catch:
do nothing
update TBL set val = val + 1 where key = 'xyz'
То есть вы сначала пытаетесь сделать творение. Если он уже есть, игнорируйте ошибку. В противном случае вы создаете его со значением 0.
Затем выполните обновление, которое будет работать правильно, независимо от того,
- строка изначально существовала.
- кто-то обновил его между вставкой и обновлением.
Это не единственная инструкция, и все же, как ни странно, это то, как мы успешно выполняли ее долгое время.