一尘不染

MYSQL INSERT或UPDATE IF

sql

现在已经在网上浏览了一段时间,似乎看不到任何与我想要的东西类似的东西。我知道这与我编写查询的方式有关,但是任何帮助将不胜感激。

我正在尝试做的基础知识是:

  • 如果表中不存在,则将其插入表中
  • 更新项目(如果存在)

它以以下格式存在:

名称,条形码,物品,数量,位置,价格和日期

名称-可以在多行条形码中使用-用于特定项目,但可以用作多个位置项目-与条形码相同,但包含名称数量-自我说明的位置-这可以是不同的位置价格-
附加到特定商品的日期-上一次购买该商品的时间

棘手的事情是,“名称”可以在不同的位置以不同的价格包含多个商品(条形码和商品)。这样的想法是,客户可以看到他们在设定的时间购买了多少商品,因此他们知道需要出售多少商品。

但是,他们购买的价格可能会有所不同,因此,如果价格与之前的购买价格不同,则需要在表格中创建另一行。

整件事背后的想法是要记录每个位置的每个项目的“名称”,然后记录他们在何时以及上次购买该项目时的价格。

希望这是有道理的。

在伪代码中:

    Insert into table if does not exist
    - name, barcode, item, quantity, location, price and date
    If name, barcode, item, location and price are the same
    - Update quantity and date (if more recent)

阅读 166

收藏
2021-03-10

共1个答案

一尘不染

首先,UNIQUE在名称,条形码,商品,位置和价格上添加一个约束。

ALTER TABLE  tableX
  ADD CONSTRAINT tableX_UQ
    UNIQUE (name, barcode, item, location, price) ;

然后,您可以使用INSERT INTO ... ON DUPLICATE KEY UPDATE

INSERT INTO tableX
  (name, barcode, item, location, price, quantity, date)
VALUES
  (?, ?, ?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
  quantity = CASE WHEN VALUES(date) > date
               THEN quantity + VALUES(quantity)        -- add quantity
               ELSE quantity                           -- or leave as it is
             END
, date = CASE WHEN VALUES(date) > date
               THEN VALUES(date) ;                     -- set date to new date
               ELSE date                               -- or leave as it is
             END

REPLACE也可以使用,但是行为有所不同(如果您具有外键,则尤为重要)。

2021-03-10