【问题标题】:PHP & MySQL - INSERT WHERE NOT EXISTS [duplicate]PHP & MySQL - 在不存在的地方插入 [重复]
【发布时间】:2020-12-16 12:08:58
【问题描述】:

我需要插入数据,除非该行中存在 2 个字段。以下是我当前的查询,它添加了所有有效的内容。

$sql = "INSERT INTO contact_sync_status (ghl_contact_email, ghl_contact_data, result, wp_user_id) VALUES ('$source->email', '$payload', 'success', $user->id)"; 

所以我尝试了以下方法使其成为有条件的:

$sql = "INSERT INTO contact_sync_status (ghl_contact_email, ghl_contact_data, result, wp_user_id) VALUES ('$source->email', '$payload', 'success', $user->id) WHERE NOT EXISTS (SELECT 1 FROM contact_sync_status WHERE ghl_contact_email = '$source->email' AND wp_user_id = $user->id)";

但我收到一个 SQL 语法错误,因为 WHERE NOT EXISTS 似乎不能与 INSERT 一起使用。我也尝试过在数据库中使用唯一索引,但这不是一个选项。

【问题讨论】:

  • 首先进行完全独立的查询以查看它是否存在。
  • 为什么不能选择唯一索引?这是做你想做的事情的公认(也是唯一有效的)机制。
  • 您可以通过先进行选择来保证防止重复。
  • @GrumpyCrouton 你有没有机会提供一个如何做到这一点的例子?第一个将是一个选择,但我将如何使用它?

标签: php mysql


【解决方案1】:

要使用WHERE 子句,您必须使用SELECT 查询数据,而不是VALUES

$sql = "INSERT INTO contact_sync_status (ghl_contact_email, ghl_contact_data, result, wp_user_id)
        SELECT '$source->email', '$payload', 'success', $user->id
        FROM DUAL
        WHERE NOT EXISTS (SELECT 1 FROM contact_sync_status WHERE ghl_contact_email = '$source->email' AND wp_user_id = $user->id)";

但在(ghl_contact_email, wp_user_id) 上添加唯一索引肯定会更好,然后使用INSERT IGNORE

【讨论】:

  • 现在将其作为准备好的语句呈现:D
  • 我不想每次回答 SQL 问题时都这样做。就我而言,上面的评论就足够了。
  • 我同意,我只是在开玩笑而不是认真。我不得不真正考虑如何用上面的那种查询正确地做占位符,开始自我怀疑,跑了一些测试,现在感觉好多了。
猜你喜欢
  • 2012-10-18
  • 2013-03-15
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 2018-07-03
  • 2019-01-11
相关资源
最近更新 更多