【问题标题】:Conditionally insert a row有条件地插入一行
【发布时间】:2011-03-19 16:18:48
【问题描述】:

我想在表 A 中插入一行,但前提是表 B 中存在另一行。例如这样的事情......

IF EXISTS (SELECT * FROM B WHERE id=1)
    INSERT INTO A
        (id, value1, value2)
        VALUES (1, 'foo', 'bar')

但是这不起作用。什么会?

【问题讨论】:

  • 哇。这(插入一行之前检查条件)真的不是应用层的工作吗?如果该行实际上不存在,您会如何反应?
  • 如果该行不存在,则无需发生任何事情。在这种情况下,只做一个这样的查询会更有效率。为了回答您的另一个问题,我认为将检查放在应用程序层中不会有更好的风格,因为无论如何它都在查询旁边。
  • 我认为 Pekka 的观点是应用程序不知道查询的状态。如果条件为假,则查询成功。通常,您希望您的应用程序知道数据是否已保存。否则,您一开始就不会费心存储它。

标签: mysql insert conditional exists


【解决方案1】:
INSERT INTO A (value1, value2, value3)
    SELECT 'foo', 'bar', 'foo' FROM B WHERE ID = 1

这里的一个潜在问题是,如果多次满足您的条件,它将插入尽可能多的行,因此请调整您的查询,但它会执行您想要的操作,只有在满足选择条件时才插入。

【讨论】:

  • 您能更详细地解释一下这是如何工作的吗?可能我对select不够了解,但它怎么能做到呢?
  • @incrediman:SELECT 中的值是静态定义的——它们不是 TABLE_B 中存在的值
  • 基本上有这种语法,因此您可以将行从其他表插入到一个表中,但由于您可以使用常量值,因此您实际上不必使用您查询的表值。尽管如此,如果查询没有返回任何行,则不会插入任何行,因此您可以使用该工具根据您使用的示例根据其他表上的值有条件地插入。
  • +1 刚刚输入的查询与您弹出的答案完全相同。
  • 谢谢大家。另外,这绝对是正确的语法吗?没有其他括号等? VALUES(...) 通常不需要吗?
【解决方案2】:

看看this MySQL 手册,它给出了一个使用 SELECT 的例子,但也许 INSERT 也可以以类似的方式工作?

【讨论】:

    猜你喜欢
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多