SQL, как увеличить или уменьшить один для столбца int в одной команде

У меня есть таблица ордеров, у которой есть столбец Количество. Во время проверки или проверки нам нужно обновить столбец "Количество" на единицу. Есть ли способ сделать это в одном действии, или мы должны получить существующее значение, а затем добавить или минус один поверх него?

Другой вопрос: когда мы вставляем новую строку, нужно ли проверять, существуют ли те же самые данные, а затем вставить, если нет, что два шага, или есть лучший способ сделать это?

спасибо,

Ответ 1

Чтобы ответить на первый:

UPDATE Orders SET Quantity = Quantity + 1 WHERE ...

Чтобы ответить на второй:

Есть несколько способов сделать это. Поскольку вы не указали базу данных, я буду предполагать MySQL.

  • INSERT INTO table SET x=1, y=2 ON DUPLICATE KEY UPDATE x=x+1, y=y+2
  • REPLACE INTO table SET x=1, y=2

Они оба могут решить ваш вопрос. Однако первый синтаксис позволяет более гибко обновлять запись, а не просто заменять ее (как это делает второй).

Имейте в виду, что для того, чтобы оба существовали, должен быть определен UNIQUE-ключ...

Ответ 2

Одношаговый ответ на первый вопрос - использовать что-то вроде:

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.

Затем выполните обновление, которое будет работать правильно или нет:

  • строка изначально существовала.
  • кто-то обновил его между вашим вставкой и обновлением.

Это не одна инструкция, и, тем не менее, удивительно, как мы это делали успешно в течение долгого времени.

Ответ 3

UPDATE Orders Order
SET Order.Quantity =  Order.Quantity - 1
WHERE SomeCondition(Order)

Насколько я знаю, встроенная поддержка INSERT-OR-UPDATE в SQL не поддерживается. Я предлагаю создать хранимую процедуру или использовать условный запрос для достижения этого. Здесь вы можете найти набор решений для разных баз данных.

Ответ 4

Если мое понимание верное, обновления должны быть довольно простыми. Я бы просто сделал следующее.

UPDATE TABLE SET QUANTITY = QUANTITY + 1 and
UPDATE TABLE SET QUANTITY = QUANTITY - 1 where QUANTITY > 0

Вам могут потребоваться дополнительные фильтры, чтобы просто обновить одну строку вместо всех строк.

Для вставок вы можете кэшировать уникальный идентификатор, связанный с вашей записью, локально и проверять этот кеш и решить, следует ли вставлять его или нет. Альтернативный подход заключается в том, чтобы всегда вставлять и проверять ошибку нарушения PK и игнорировать, поскольку это избыточная вставка.

Ответ 5

чтобы ответить на второй:

сделать столбец уникальным и поймать исключение, если оно установлено на то же значение.

Ответ 6

@dotjoe Дешевле обновлять и проверять @@rowcount, делать вставку после этого факта.

Исключения являются дорогостоящими и & обновления чаще встречаются

Предложение. Если вы хотите быть uber-исполнителем в своем DAL, сделайте переднюю часть в уникальном идентификаторе для строки, которая будет обновлена, если нулевая вставка.

DAL должны быть CRUD, и не нужно беспокоиться о том, чтобы быть без гражданства.

Если вы сделаете его безстоящим, с хорошими индексами, вы не увидите diff со следующим оператором SQL vs 1. IF (выберите верхнюю 1 * форму x, где PK = @ID)   Вставить еще   обновление