需要一个唯一的电子邮件地址

时间:2013-07-12 19:07:33

标签: php mysql sql performance

MySQL数据库中的表格包含电子邮件地址列。最终,电子邮件地址应该是唯一的并且具有有效的格式。我无法确定应该在哪里进行检查以及需要进行哪些检查。

显然,单靠SQL无法完全验证电子邮件地址,但我正在考虑添加NOT NULL约束以防止提交空白电子邮件地址。由于每个电子邮件地址必须是唯一的,因此e-mail列的唯一键似乎是合理的,但仅仅因为列是唯一键并不能使NOT NULL正确吗?由于我可能要使用PHP验证服务器上的电子邮件地址,我还可以检查一下它是否为空。

我正在制作的一条重要信息是添加唯一键还是约束会使搜索更快或更慢

对于保存电子邮件地址的列,其中不应有重复项且没有空字符串/空等,是否应该将其设为唯一键和/或给出NOT NULL约束或其他内容?

我是MySQL的新手,因此代码示例会有所帮助。我有phpMyAdmin,如果它更容易使用。

对于唯一的我会使用ALTER TABLE USER ADD UNIQUE INDEX(``e-mail``);
对于not null,我会使用ALTER TABLE user CHANGE ``e-mail`` varchar(254) NOT NULL;

我的另一个想法是插入一个带有空电子邮件地址的行,然后使该电子邮件列唯一,这样就不会插入其他空的电子邮件地址。

4 个答案:

答案 0 :(得分:1)

添加唯一约束实际上会使搜索更快,因为它将通过此​​字段索引表。根据您对问题的描述,我认为您的alter table陈述是正确的。

答案 1 :(得分:1)

具有唯一索引的字段仍然可以允许空值。 nulls永远不能等于其他任何东西,包括它们自己,所以多个null不会违反唯一性约束。但是,您可以通过将其指定为NOT NULL来禁止字段中的空值。

唯一键是普通字段索引,它不允许特定值的多个实例。插入/更新会略微减慢,因此可以更新密钥,但搜索速度会更快,因为索引可以(在某些情况下)用于加速搜索。

答案 2 :(得分:1)

到目前为止的答案都很好,我建议您使用UNIQUE KEYNOT NULL作为您的申请。使用UNIQUE KEY可能会降低INSERTUPDATE的速度,但肯定不会减慢搜索速度。

但是,您应该考虑的一件事是,仅仅因为您使用UNIQUE KEY,它不一定强制使用唯一的电子邮件地址。例如,abc @ gmail.com和a.b.c@gmail.com代表相同的电子邮件。如果您不想允许这样做,您应该先将PHP中的电子邮件地址标准化,然后再将它们发送到您的数据库。

答案 3 :(得分:0)

使用MySQL,您必须记住,唯一索引取决于整个表的排序规则(在upper()函数中可以在其他数据库中进行)。 看到这个链接: http://sqlfiddle.com/#!2/37386/1 现在,如果您使用utf8_general_ci utf8_bin,则索引创建将失败。