【问题标题】:MySQL INSERT INTO ... SELECT or default valueMySQL INSERT INTO ... SELECT 或默认值
【发布时间】:2014-07-08 22:36:17
【问题描述】:

我正在处理以下查询:

INSERT INTO a (id, value) VALUES (_id, (SELECT value FROM b WHERE b.id = _id));

表a:id、值(有默认值)

表 b:id、值

表 b 不包含所有请求的值。所以 SELECT 查询有时会返回 0 行。在这种情况下,它应该使用 a.value 的默认值。

这有可能吗?

编辑:

标记为已解决的帖子的 cmets 中空列的解决方案。

【问题讨论】:

    标签: mysql sql select insert


    【解决方案1】:

    您可以将值包装在coalesce(max(value), default_value)中

    INSERT INTO a (id, value) 
    VALUES (_id, (SELECT coalesce(max(value), default_value)) FROM b WHERE b.id = _id));
    

    【讨论】:

    • 如果只需要设置自定义值,使用COALESCE(NULL,"yourdefaultvalue")
    【解决方案2】:

    以下查询会起作用。首先从表 b 中查找 max(value) 的 _id。它将为 NULL 或等于 b.value。如果为NULL(使用COALESCE函数检查),则将表a的value列的默认值设置为value。

    使用DEFAULT函数访问表a的value列的默认值(请参考参考资料1)。

    INSERT INTO a
    SELECT 
      _id, 
      COALESCE(max(value), (SELECT DEFAULT(value) FROM a LIMIT 1)) value
    FROM b
    WHERE id = _id;
    

    SQL Fiddle demo

    参考:

    1. How to SELECT DEFAULT value of a field on SO

    【讨论】:

    • 我已经测试过了,但解决方案并不完美。如果表 a 中有不止一行,则此方法有效。但不幸的是,情况并非总是如此。 :/ 如果表为空,是否有可能进行查询?
    • 您参考中的理论解决方案也不起作用(解决方案本身):sqlfiddle.com/#!2/6fd73/1
    • 您是否愿意通过此查询获取默认值? SELECT COLUMN_DEFAULT FROM information_schema.columns WHERE TABLE_NAME = 'a' AND COLUMN_NAME = 'id';
    • 是的,这行得通!可惜 MySQL 没有提供获取(空)列默认值的函数。
    【解决方案3】:

    如果 MySQL 遵循其他 RDBMS 行为,则仅在您甚至不指定字段时才使用默认值。这意味着您需要两个不同的 INSERT 语句:

    IF (EXISTS(SELECT * FROM b WHERE id = _id)) THEN
      INSERT INTO a (id, value) SELECT _id, value FROM b WHERE id = _id;
    ELSE
      INSERT INTO a (id) SELECT _id;
    END IF;
    

    或者,可能是这样的......

    INSERT INTO a (id, value) SELECT _id, value FROM b WHERE id = _id;
    
    IF ((SELECT ROW_COUNT()) = 0) THEN
      INSERT INTO a (id) SELECT _id;
    END IF;
    

    请注意,这是概念性的。我已经为你查找了语法,但我还没有在 MySQL 上测试过。

    【讨论】:

    • 这两个例子都不起作用。 /*没有像第一个示例那样的 EXISTS 函数,*/第二个不起作用,因为即使 SELECT 查询返回 0 行,INSERT 查询仍然成功。
    猜你喜欢
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 2011-07-12
    相关资源
    最近更新 更多