【问题标题】:Mysql query select case when true insert真正插入时的Mysql查询选择案例
【发布时间】:2026-02-12 07:45:01
【问题描述】:

有人知道如何在 mysql 中执行以下语法吗?

没有存储过程,仅在单个查询中


SELECT CASE
 WHEN COUNT(v.value) = 0 THEN (
  INSERT INTO tbl_v (fid, uid, VALUE)
  SELECT fid, 1 AS uid, 'xxxxxx' AS VALUE FROM tbl_f
  WHERE category = 'categoryname' AND NAME = 'somevalue'
 )WHEN v.value <> 'test' THEN (
  'update syntax here' /* will be similar like insert statement above */
 )ELSE (
  v.value
 )END
FROM shared_tbl_f f
INNER JOIN tbl_v v ON f.fid = v.fid
WHERE v.uid = 1 AND f.category = 'categoryname' AND f.name = 'somevalue'

注意:

tbl_v 上没有主键 tbl_v 的唯一引用只是列 fid 和列 uid 的组合。

因为tbl_v 是一个映射表(那里没有主键) - fid 和 uid 是另一个表的外键。

【问题讨论】:

    标签: mysql select insert case


    【解决方案1】:

    您可以在插入语句中使用ON DUPLICATE KEY UPDATE 子句。

    INSERT INTO tbl_v (fid, uid, VALUE)
      SELECT fid, 1 AS uid, 'xxxxxx' AS VALUE FROM tbl_f
      WHERE category = 'categoryname' AND NAME = 'somevalue'
    ON DUPLICATE KEY UPDATE
      value = ?;
    

    要使其工作,他们需要成为列上的主键或唯一索引。然后重复值将启动语句的更新部分。

    参考:http://dev.mysql.com/doc/refman/5.5/en/insert-select.html

    【讨论】:

    • 感谢您的回复,但是如果唯一键是列 fid 和列 uid 的组合,这种方法是否仍然可行?因为 tbl_v 是一个映射表(那里没有主键) - fid 和 uid 是另一个表的外键
    • 听起来应该在 (fid, uid) 的 tbl_v 上有一个复合主键。您可以使用以下内容添加一个。 ALTER TABLE tbl_v ADD CONSTRAINT PRIMARY KEY (fid, uid);
    【解决方案2】:

    你不能,对不起。您必须在存储过程或应用程序逻辑中执行此操作。

    【讨论】:

    • 是吗?以前它使用了 2 个查询,但我认为一次使用 1 个查询而不是从应用程序逻辑调用的多个查询会更优化