MySQL INSERT INTO ... SELECT 或默认值

问题描述 投票:0回答:3

我正在处理以下查询:

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

表a:id,value(有默认值)

表b:id,值

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

这有可能吗?

mysql sql select insert
3个回答
3
投票

您可以将值包装在

coalesce(max(value), default_value)

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

0
投票

以下查询可行。首先从表 b 中查找 _id 的 max(value)。它要么是 NULL,要么等于 b.value。如果为 NULL(使用 COALESCE 函数检查),则将表 a 的 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 演示

参考

  1. 如何在 SO 上选择字段的默认值

0
投票

如果 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 上测试过。

© www.soinside.com 2019 - 2024. All rights reserved.