【问题标题】:Is it possible to insert a row but only if a value does not already exist?是否可以插入一行,但前提是值不存在?
【发布时间】:2008-11-13 00:38:38
【问题描述】:

是否可以插入一行,但前提是表中已有的值之一不存在?

我正在为电子商务系统创建一个带有推荐点的 告诉朋友,我需要将朋友的电子邮件插入数据库表中,但前提是它不存在于桌子。这是因为一旦新客户注册并购买了东西,我不希望超过 1 人获得推荐积分。因此,我只希望在表格中出现一次电子邮件。

我正在使用 PHP 4 和 MySql 4.1。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    很可能是这样的:

    IF NOT EXISTS(SELECT * FROM myTable WHERE Email=@Email) THEN INSERT INTO blah blah
    

    这可以整合到一个数据库查询中。

    【讨论】:

      【解决方案2】:

      MySQL 提供REPLACE INTO http://dev.mysql.com/doc/refman/5.0/en/replace.html:

      REPLACE 的工作方式与 INSERT 完全相同, 除了如果表中的旧行 具有与 a 的新行相同的值 PRIMARY KEY 或 UNIQUE 索引, 在新行之前删除旧行 已插入。

      【讨论】:

        【解决方案3】:

        如果您在列上有唯一索引或主键(本例中为 EmailAddr),则此方法有效:

        INSERT IGNORE INTO Table (EmailAddr) VALUES ('test@test.com')
        

        如果与该电子邮件的记录已经存在(重复密钥违规)而不是错误,则使用此语句,该语句将失败并且没有插入任何内容。

        请参阅MySql docs 了解更多信息。

        【讨论】:

        • "INSERT IGNORE" 是最好的答案,但如果您出于某种原因(可能是时间戳触发器或其他原因)想要重新插入行,REPLACE (dev.mysql.com/doc/refman/5.0/en/replace.html) 也是一个选项。
        • 警惕 REPLACE 增加你的自动增量 - 在引擎盖下它只是一个删除,插入。
        【解决方案4】:

        如果列是主键或唯一索引:

        INSERT INTO table (email) VALUES (email_address) ON DUPLICATE KEY UPDATE
        email=email_address
        

        知道我的运气有更好的方法来做到这一点。 AFAIK 在 MySQL 中没有相当于“ON DUPLICATE KEY DO NOTHING”的东西。我不确定 email=email_Address 位,您可以玩一下,看看它是否有效,而无需指定操作。正如上面有人所说,如果它有独特的限制,无论如何都不会发生。如果您希望表中的所有电子邮件地址都是唯一的,则没有理由在列定义中将其指定为唯一。

        【讨论】:

        • 我将电子邮件设置为 phpMyAdmin 中的唯一键,然后使用您的代码。而且效果很好!谢谢
        • Re: 不等同于 ON DUPLICATE KEY DO NOTHING。请参阅 Todd 的解决方案。或者,您可以执行类似 ON DUPLICATE KEY UPDATE email=email 之类的操作,尽管这样做肯定更浪费。
        【解决方案5】:

        对 naeblis 的回答稍作修改/补充:

        INSERT INTO table (email) VALUES (email_address)
        ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id)
        

        这样您就不必在其中抛出 email=email_address并且如果语句更新,您将获得正确的 LAST_INSERT_ID() 值。

        来源: MySQL 文档:12.2.5.3

        【讨论】:

          【解决方案6】:

          我不确定我是否得到它,但是一个呢

          try {
            mysql_query($sql);
          }
          catch(Exception $e) {
          
          }
          

          结合 MySQL 中的唯一字段索引?

          如果它抛出异常,那么你就知道你有一个重复的字段。 对不起,如果那不能回答你的问题..

          【讨论】:

          • 感谢您的回复,但我认为它不能解决我的问题。我想要一个查询,它要么插入行,要么在失败时不执行任何操作。
          • 如果抛出异常,则不会添加该行。你可以只记录,或者什么都不做。
          • 但是用之前的查询,每次都报错。我希望它在 mySql 中静默失败。
          • 这是解决 DB 外部问题的好方法,但它不能解决 DB 中的问题,可以说,这是应该注意的地方。
          • @Jeremiah Peschka - 明智的话
          【解决方案7】:

          如果电子邮件字段是主键,则表上的约束将阻止输入重复项。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-12
            • 1970-01-01
            相关资源
            最近更新 更多