【问题标题】:INSERT into table if a different result does not exist如果不存在不同的结果,则插入表中
【发布时间】:2012-06-24 03:02:48
【问题描述】:

我有一个像这样的“用户”SQL 表结构(ID 是随机生成的,不是自动递增的):

ID    name     deleted    lastActive
3242  Joe      0          20-6-2012 23:14
2234  Dave     0          20-6-2012 23:13
2342  Simon    1          20-6-2012 23:02
9432  Joe      1          20-6-2012 22:58

可以有多个已删除 (deleted=1) 的同名用户,但只有 1 个未删除的同名用户(因此添加 Simon 可以,但 Dave 不行)。只有在一个 SQL 查询中没有同名且已删除 = 0 的记录时,如何才能插入?我需要这样的东西:

INSERT INTO users (ID, name) VALUES ($id, $name) 
    WHERE NOT EXISTS (SELECT 1 FROM users WHERE name = $name AND deleted = 0)

但这不是正确的语法。

【问题讨论】:

  • 为什么不简单地“取消删除”用户名?
  • @MarcB 因为它将是具有不同 ID 的新用户。用户名设置为在 5 分钟不活动后删除,以便其他人可以使用它们,但我无法将它们从表格中完全删除,因为我需要稍后将它们链接起来以生成报告

标签: php mysql insert


【解决方案1】:
INSERT INTO users (ID, name) 
SELECT $id, $name WHERE NOT EXISTS (
    SELECT 1 FROM users WHERE name = $name AND deleted = 0
)

【讨论】:

  • 您是否在不同的基于字符串的值周围添加了强制性“引号”?
  • 您是否已经逃脱了您的内容?
  • 是的,我已经尝试将其作为带引号的 mysql_query(未转义但仅使用 id=234234 和 name=joe,并且作为准备好的 mysqli 语句,两者都在 WHERE NOT EXISTS 处给出语法错误...位
  • joe 是一个字符串,你必须转义它
  • 'joe' 不需要转义!如果这就是你的意思,我在它周围加上引号?
【解决方案2】:

使用MySQL's REPLACE syntax

确保 ID 是主键或唯一键,并在所有三个 ID、名称和已删除列上创建索引。

REPLACE INTO users (ID, name) VALUES ($id, $name) 

【讨论】:

    【解决方案3】:
    INSERT INTO users SELECT '1', 'Bob','','' FROM DUAL WHERE NOT EXISTS(SELECT ID FROM users WHERE name = 'Bob' AND deleted ='0' LIMIT 1)
    

    【讨论】:

      【解决方案4】:

      使用 LEFT JOIN 设置

      • 子查询 A 包含您的随机数,别名为 ID,$name 别名为 name。
      • 子查询 B 选择未删除的 name = $name。
      • LEFT JOIN A 到 B 并返回 A.* 如果它没有 LEFT JOIN 的右侧对应项

      这是查询

      INSERT INTO users (ID,name)
      SELECT A.* FROM
      (SELECT RAND() ID,'$name' name) A LEFT JOIN
      (SELECT name FROM users WHERE name='$name' AND deleted=0) B
      USING (name) WHERE B.name IS NULL;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-17
        • 2013-02-23
        • 2014-04-14
        • 2014-06-11
        • 1970-01-01
        • 2017-04-24
        • 2016-05-15
        相关资源
        最近更新 更多