0

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

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

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

对于包含不应有重复和空字符串/空值等的电子邮件地址的列,是否应将其设为唯一键和/或给予NOT NULL约束或其他内容?

我对 MySQL 非常陌生,所以代码示例会很有帮助。如果使用起来更容易,我有 phpMyAdmin。

对于我将使用的唯一性 对于我将使用ALTER TABLE USER ADD UNIQUE INDEX(``e-mail``);
的非空ALTER TABLE user CHANGE ``e-mail`` varchar(254) NOT NULL;

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

4

4 回答 4

1

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

于 2013-07-12T19:12:14.743 回答
1

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

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

于 2013-07-12T19:12:43.043 回答
1

到目前为止的答案都很好,我建议您将UNIQUE KEYandNOT NULL用于您的应用程序。使用或UNIQUE KEY可能会减慢搜索速度,但肯定不会减慢搜索速度。INSERTUPDATE

但是,您应该考虑的一件事是,仅仅因为您使用UNIQUE KEY,它并不一定强制使用唯一的电子邮件地址。例如,abc@gmail.com 和 abc@gmail.com 代表相同的电子邮件。如果您不想这样做,您应该在将电子邮件地址发送到您的数据库之前在 PHP 中规范化电子邮件地址。

于 2013-07-12T19:20:01.247 回答
0

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

于 2013-07-12T19:32:04.197 回答