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

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

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

спасибо,

Ответ на: "S'L как увеличить или уменьшить один для int столбца в одной команде"

Количество ответов:6

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

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

Ответить на второй:

Есть несколько способов сделать это. Так как вы не указали базу данных, я предполагаю, MyS'L.

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

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

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

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

Насколько я знаю, нет никакой поддержки сборки для INSERT-OR-UPDATE в S'L. Я предлагаю создать сохраненную процедуру или использовать условный запрос для достижения этой цели. Here you can find a collection of solutions for different databases. вы можете найти коллекцию решений для различных баз данных.

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

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

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

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

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

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

Еще nonenone Вставить обновление

IF (выберите верхнюю 1 и форму x, где [email protected])

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

update TBL set CLM = CLM + 1 where key = 'KEY'

Это очень много одной инструкции способ сделать это.

Что касается второго вопроса, вам не нужно прибегать к DBMS-специфической гимнастики S'L (например, UPSERT) to get the result you want. There's a standard method to do update-or-insert that doesn't require a specific DBMS. ), чтобы получить результат, который вы хотите. Существует стандартный метод обновления или вставки, который не требует конкретного DBMS.

try:
    insert into TBL (key,val) values ('xyz',0)
catch:
    do nothing
update TBL set val = val + 1 where key = 'xyz'

То есть, вы пытаетесь сделать создание в первую очередь. Если он уже там, игнорировать ошибку. В противном случае вы создаете его с значением 0.

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

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

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