MYSQL:插入记录,如果它已经存在更新记录

问题描述:

我有一个需要更新记录,如果它存在,否则插入它。我已经尝试过以前的相关答案,但这些都不足以MYSQL:插入记录,如果它已经存在更新记录

我有一个表名与data_meta

meta_id | token | meta_key | meta_value 
1     1  terms_conditions terms conditions content 
2     1  is_config_enable  1 
3     2  terms_conditions terms conditions content 

我有一个基于令牌& meta_key。对于同样的道理meta_key不重复进行更新。

我插入查询

"INSERT INTO data_meta (token, meta_key, meta_value) 
         VALUES (" . $token . ", '" . $key . "', '" . $value . "')"; 

我的更新查询

"UPDATE data_meta SET meta_value = '" . $value . "' WHERE meta_key = '" . $key . "' AND token=" . $token ; 
+0

你可以把你的脚本吗? – Boby

+0

为什么其他答案不足? - 为什么你不能用'SELECT'做一个简单的检查?然后根据该选择的结果插入/更新? – Epodax

+0

触发器怎么样? – sagi

MySQL为此仅提供REPLACE INTO statement

REPLACE INTO data_meta (token, meta_key, meta_value) VALUES (x, y, z); 

对于这项工作的(标记,meta_key)的组合应该是主键,或者你需要为(令牌,meta_key)

显然你meta_id组合创建唯一索引是你的自动增加指数。

您忘记在更新查询中使用它。没有它,该查询将无法正常工作,更新需要WHERE条件。

一旦你掌握了这一点,解决方案是显而易见的。那么它是怎样工作的?

如果您不知道meta_id您插入,如果你知道它可以更新。就这么简单。

创建(令牌,meta_key)潮头指数如果不是存在:

create unique index data_meta_tm on data_meta(token, meta_key); 

查询:

"INSERT INTO data_meta (token, meta_key, meta_value) 
         VALUES (" . $token . ", '" . $key . "', '" . $value . "') 
    ON DUPLICATE KEY UPDATE meta_value = VALUES(meta_value)"; 
+0

这可能不会重复因为“meta_value”是重复的,因此请做任何更新,即“更改某些内容”。 –

+0

@KIKOSoftware为什么? MySQL ON UPDATE子句中的函数VALUES从插入值部分获取指定列的值。 – Mike

+0

你说得对。在http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html它说它只检查UNIQUE索引或PRIMARY KEY中的值是否会导致重复。我认为它会检查所有列。你不能只读这个SQL,你必须知道表结构。 –