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 ;
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)";
这可能不会重复因为“meta_value”是重复的,因此请做任何更新,即“更改某些内容”。 –
@KIKOSoftware为什么? MySQL ON UPDATE子句中的函数VALUES从插入值部分获取指定列的值。 – Mike
你说得对。在http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html它说它只检查UNIQUE索引或PRIMARY KEY中的值是否会导致重复。我认为它会检查所有列。你不能只读这个SQL,你必须知道表结构。 –
你可以把你的脚本吗? – Boby
为什么其他答案不足? - 为什么你不能用'SELECT'做一个简单的检查?然后根据该选择的结果插入/更新? – Epodax
触发器怎么样? – sagi