【问题标题】:MYSQL: Insert record if it is already exists update recordMYSQL:如果已经存在则插入记录更新记录
【发布时间】:2016-08-25 07:29:12
【问题描述】:

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

我有一个带有 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

我必须根据令牌和元密钥进行更新。对于相同的令牌元密钥不会重复..

我的插入查询

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

【问题讨论】:

  • 你能把你的脚本放在这里吗?
  • 为什么其他答案还不够? - 你为什么不能用SELECT 做一个简单的检查?然后根据该选择的结果插入/更新?
  • 触发器怎么样?
  • 警告:这有一些严重的SQL injection bugs,因为在查询中使用了$_GET 数据。尽可能使用准备好的语句。在mysqliPDO 中执行这些操作非常简单,其中任何用户提供的数据都使用?:name 指示符指定,稍后使用bind_paramexecute 填充,具体取决于您是哪个使用。

标签: php mysql


【解决方案1】:

MySQL 为此提供了REPLACE INTO statement

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

为此,(token, meta_key) 的组合应该是主键,或者您需要为 (token, meta_key) 的组合创建唯一索引

【讨论】:

    【解决方案2】:

    显然您的meta_id 是您的自动增加索引。

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

    一旦你掌握了这一点,解决方案就很明显了。那么它是如何工作的呢?

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

    【讨论】:

      【解决方案3】:

      在 (token, 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 从插入值部分获取指定列的值。
      • 你是对的。在:dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html 它说它只检查 UNIQUE 索引或 PRIMARY KEY 中的值是否会导致重复。我以为它会检查所有列。你不能只看这个SQL,你必须知道表结构。
      • PS:DUPLACATE 应该是:DUPLICATE。我认为这是一个很好的解决方案。如果我没看错的话,我应该会看到上面写着:ON DUPLICATE **KEY**
      猜你喜欢
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      相关资源
      最近更新 更多