当前位置: 首页 > 面试题库 >

MySQL INSERT IF(自定义if语句)

长孙星汉
2023-03-14
问题内容

首先,这是问题的简要摘要:

是否可以INSERT有条件地运行语句?类似于以下内容:

IF(expression) INSERT...

现在,我知道可以使用存储过程来做到这一点。我的问题是:我可以在查询中这样做吗?

现在,我为什么要这样做?

假设我们有以下两个表:

products: id, qty_on_hand
orders: id, product_id, qty

现在,假设有一个订购20个Voodoo娃娃(产品ID 2)的订单。
我们首先检查手头上是否有足够的数量:

SELECT IF(
    ( SELECT SUM(qty) FROM orders WHERE product_id = 2  ) + 20
    <=
    ( SELECT qty_on_hand FROM products WHERE id = 2)
, 'true', 'false');

然后,如果计算结果为true,则运行INSERT查询。
到目前为止,一切都很好。

但是,并发性存在问题。
如果有2个订单 恰好同时出现 ,则他们可能都在任何一个都输入订单之前都读取了现有数量。然后,他们都会下订单,因此超过了qty_on_hand

因此,回到问题的根源:
是否可以INSERT有条件地运行一条语句,以便我们可以将这两个查询组合为一个?

我搜索了很多东西,而INSERT我能找到的唯一条件语句类型是ON DUPLICATE KEY,显然在这里不适用。


问题答案:
INSERT INTO TABLE
SELECT value_for_column1, value_for_column2, ...
FROM wherever
WHERE your_special_condition

如果选择未返回任何行(因为特殊条件为false),则不会发生插入。

使用问题中的架构(假设您的id列为auto_increment):

insert into orders (product_id, qty)
select 2, 20
where (SELECT qty_on_hand FROM products WHERE id = 2) > 20;

如果手头的库存不足,则不会插入任何行,否则将创建订单行。

好主意顺便说一句!



 类似资料:
  • 我正在尝试从输入提示中获取此人的姓名。获取名称长度,如果长度小于1,则抛出自定义错误抛出LineLimitException,并再次提示用户输入他们的名称。我知道我在这里投入了很多代码,但我希望它能让我想要做的事情更清楚。 LineLimitException类 在这里我提示并存储name字段

  • 我目前正在学习Java,作为其中的一部分,我正在尝试制作一个随机数生成器。 该项目仍处于早期阶段,但当我制作错误检查组件时,我遇到了一些问题,我一直在想为什么它不能以这种方式工作。 下面是错误检查器,它接收numberAmount(用户请求的随机数的数量)和randomDigit(随机数的最大位数)。 我想让它在数量或数字过高时进行标记,这可能会导致应用程序崩溃。 下面是代码。 当我不插入

  • 包是Go语言中代码组成和代码编译的主要方式。关于包的基本信息我们已经在前面介绍过了,本节我们主要来介绍一下如何自定义一个包并使用它。 到目前为止,我们所使用的例子都是以一个包的形式存在的,比如 main 包。在Go语言里,允许我们将同一个包的代码分隔成多个独立的源码文件来单独保存,只需要将这些文件放在同一个目录下即可。 我们创建的自定义的包需要将其放在 GOPATH 的 src 目录下(也可以是

  • 是否有可能为raku语法定义一个自定义lexer,即将字符串转换为int-id值流的lexer?我在玩弄语法结构。 规则看起来很直观,因为它们可能在递归下降解析器中转换为函数。然而,令牌和正则表达式我希望能够通过显式令牌ID和一个接口将它们映射到一个名称,这样我就可以编写自己的lexer了?

  • 本文向大家介绍MyBatisPlus 自定义sql语句的实现,包括了MyBatisPlus 自定义sql语句的实现的使用技巧和注意事项,需要的朋友参考一下 一、引言 Good Good Study,Day Day Up MP自带的条件构造器虽然很强大,有时候也避免不了写稍微复杂一点业务的sql,那么那么今天说说MP怎么自定义sql语句吧。 二、配置 自定义的sql当然是写在XML文件中的啦,那么首

  •  if 语句,就是类似于「如果○○的话,做●●」,根据条件判断脚本的一部分是否执行的语法。  语法如下: if(expression) 语句或语句块 else 语句或语句块  第一个“语句或语句块”是当 expression 表达式的结果为真时执行的部分,第二个“语句或语句块”则是结果为假时执行的部分。如果不需要 else 以后的部分,可以省略。 例: if(a==b) inform("a和b相等