真正插入时的Mysql查询选择案例
Posted
技术标签:
【中文标题】真正插入时的Mysql查询选择案例【英文标题】:Mysql query select case when true insert 【发布时间】:2011-01-23 13:55:23 【问题描述】:有人知道如何在 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 是另一个表的外键。
【问题讨论】:
【参考方案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 个查询而不是从应用程序逻辑调用的多个查询会更优化以上是关于真正插入时的Mysql查询选择案例的主要内容,如果未能解决你的问题,请参考以下文章