Php MYSQL:如果已存在,则插入记录更新记录

Php MYSQL:如果已存在,则插入记录更新记录,php,mysql,Php,Mysql,如果记录存在,我需要更新它,否则请插入它。我已经尝试过以前的相关答案,但这些都是不够的 我有一个带有数据元的表名 meta_id | token | meta_key | meta_value 1 1 terms_conditions terms conditions content 2 1 is_config_enable 1 3 2

如果记录存在,我需要更新它,否则请插入它。我已经尝试过以前的相关答案,但这些都是不够的

我有一个带有数据元的表名

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_密钥不会重复

我的插入查询

"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 data_meta (token, meta_key, meta_value) VALUES ( x, y, z );
为此,令牌和元密钥的组合应该是主键,或者您需要为令牌和元密钥的组合创建一个唯一的索引。显然,您的元id是您的自动增加索引

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

一旦你掌握了这一点,解决办法是显而易见的。那么它是如何工作的呢


如果你不知道你插入的元id,如果你知道,你可以更新。就这么简单。

在令牌上创建uniqe索引,如果不存在meta_键:

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)";

你能把你的剧本放在这里吗?为什么其他答案不够为什么你不能用SELECT做一个简单的检查呢?然后根据该选择的结果插入/更新?触发器如何?警告:这有一些严重问题,因为在查询中使用了$\u GET数据。尽可能使用事先准备好的陈述。在任何用户提供的数据都是用?或:名称指示符,稍后使用bind_param或execute填充,具体取决于您使用的是哪一个。此指示符的可能副本不会进行任何更新,即“更改某些内容”,因为meta_值是重复的。@KIKOSoftware为什么?MySQL ON UPDATE子句中的函数值从insert VALUES部分获取指定列的值。您是对的。At:它说它只检查唯一索引或主键中的值是否会导致重复。我以为它会检查所有列。您不能只读取此SQL,您必须知道表结构。PS:DUPLACATE应该是:DUPLICATE。我认为这是一个很好的解决办法。如果我读得好的话,我会看到上面写着:在重复的**键**。