是否可以插入一行,但是只有当表中已有的某个值不存在时才会这样?
我正在为电子商务系统创建一个带有推荐点的告诉朋友,我需要将朋友的电子邮件插入数据库表中,但前提是它不存在于数据库表中表。这是因为一旦新客户注册并购买了东西,我不希望任何超过1人获得推荐积分。因此,我只想在表格中输入一次电子邮件。
我正在使用PHP 4和MySql 4.1。
答案 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)
如果电子邮件字段是主键,则表上的约束将阻止输入重复。