真正插入时的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查询选择案例的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 从选择查询中插入

mysql数据库插入数据很慢

MySQL多索引查询选择

MySql数据库-查询插入数据时转义函数的使用

MSSQL 到 MYSQL - 从 MSSQL 中选择,插入 MySQL

MySQL 跨服务器选择查询