我正在处理以下查询:
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 的默认值。
这有可能吗?
您可以将值包装在
coalesce(max(value), default_value)
中
INSERT INTO a (id, value)
VALUES (_id, (SELECT coalesce(max(value), default_value)) FROM b WHERE b.id = _id));
以下查询可行。首先从表 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;
参考:
如果 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 上测试过。