【发布时间】:2008-11-13 00:38:38
【问题描述】:
是否可以插入一行,但前提是表中已有的值之一不存在?
我正在为电子商务系统创建一个带有推荐点的 告诉朋友,我需要将朋友的电子邮件插入数据库表中,但前提是它不存在于桌子。这是因为一旦新客户注册并购买了东西,我不希望超过 1 人获得推荐积分。因此,我只希望在表格中出现一次电子邮件。
我正在使用 PHP 4 和 MySql 4.1。
【问题讨论】:
是否可以插入一行,但前提是表中已有的值之一不存在?
我正在为电子商务系统创建一个带有推荐点的 告诉朋友,我需要将朋友的电子邮件插入数据库表中,但前提是它不存在于桌子。这是因为一旦新客户注册并购买了东西,我不希望超过 1 人获得推荐积分。因此,我只希望在表格中出现一次电子邮件。
我正在使用 PHP 4 和 MySql 4.1。
【问题讨论】:
很可能是这样的:
IF NOT EXISTS(SELECT * FROM myTable WHERE Email=@Email) THEN INSERT INTO blah blah
这可以整合到一个数据库查询中。
【讨论】:
MySQL 提供REPLACE INTO http://dev.mysql.com/doc/refman/5.0/en/replace.html:
REPLACE 的工作方式与 INSERT 完全相同, 除了如果表中的旧行 具有与 a 的新行相同的值 PRIMARY KEY 或 UNIQUE 索引, 在新行之前删除旧行 已插入。
【讨论】:
如果您在列上有唯一索引或主键(本例中为 EmailAddr),则此方法有效:
INSERT IGNORE INTO Table (EmailAddr) VALUES ('test@test.com')
如果与该电子邮件的记录已经存在(重复密钥违规)而不是错误,则使用此语句,该语句将失败并且没有插入任何内容。
请参阅MySql docs 了解更多信息。
【讨论】:
如果列是主键或唯一索引:
INSERT INTO table (email) VALUES (email_address) ON DUPLICATE KEY UPDATE
email=email_address
知道我的运气有更好的方法来做到这一点。 AFAIK 在 MySQL 中没有相当于“ON DUPLICATE KEY DO NOTHING”的东西。我不确定 email=email_Address 位,您可以玩一下,看看它是否有效,而无需指定操作。正如上面有人所说,如果它有独特的限制,无论如何都不会发生。如果您希望表中的所有电子邮件地址都是唯一的,则没有理由在列定义中将其指定为唯一。
【讨论】:
对 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
【讨论】:
我不确定我是否得到它,但是一个呢
try {
mysql_query($sql);
}
catch(Exception $e) {
}
结合 MySQL 中的唯一字段索引?
如果它抛出异常,那么你就知道你有一个重复的字段。 对不起,如果那不能回答你的问题..
【讨论】:
如果电子邮件字段是主键,则表上的约束将阻止输入重复项。
【讨论】: