是否可以插入一行,但仅限于某个值尚不存在?

时间:2008-11-13 00:38:39

标签: php mysql

是否可以插入一行,但是只有当表中已有的某个值不存在时才会这样?

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

我正在使用PHP 4和MySql 4.1。

7 个答案:

答案 0 :(得分:33)

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

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

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

有关详细信息,请参阅MySql docs

答案 1 :(得分:21)

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

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

知道我的运气虽然有更好的方法。 AFAIK在MySQL中没有相应的“ON DUPLICATE KEY DO NOTHING”。我不确定email = email_Address位,你可以玩,看看它是否有效,你不必指定一个动作。正如有人说的那样,如果它有独特的限制,那么无论如何都不会发生。如果您希望表中的所有电子邮件地址都是唯一的,则没有理由在列定义中将其指定为唯一。

答案 2 :(得分:5)

最有可能是:

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

可以将其转换为一个数据库查询。

答案 3 :(得分:3)

对naeblis的答案略有修改/补充:

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

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

来源: MySQL文档:12.2.5.3

答案 4 :(得分:1)

我不确定我是否得到了它,但是

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

}

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

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

答案 5 :(得分:1)

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

  

REPLACE与INSERT完全一样,   除非表中有一个旧行   与a的新行具有相同的值   PRIMARY KEY或UNIQUE索引   在新行之前删除旧行   插入。

答案 6 :(得分:0)

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