【问题标题】:How to check that email address isn't already in use when updating it更新时如何检查电子邮件地址是否未被使用
【发布时间】:2012-08-17 03:25:05
【问题描述】:

在我的网站中,我允许我的用户更新他们的电子邮件地址。但是,我要求每个电子邮件地址都是唯一的。如何确保在更新表单中输入的电子邮件地址在数据库中更新之前是唯一的?

【问题讨论】:

  • 当他们第一次进入时,您如何确保它是独一无二的?
  • 我使用了membershipcreatestatus。

标签: asp.net sql-server


【解决方案1】:

在存储您的电子邮件地址的列上有一个unique constraint

您可以使用 UNIQUE 约束来确保没有重复值 在不参与主要的特定列中输入 键。

在具有唯一约束的表中盲目插入会引发异常。为避免这种情况,请在 where 子句中运行选择查询检查此电子邮件地址。

如果您拥有庞大的用户群,请务必为您的电子邮件列编制索引。

【讨论】:

  • 这对于默认的 aspnet_Users 表是否可行?我不想搞砸了……
  • @AndreC 您确定不存在唯一约束吗?
  • 我已将其设置为电子邮件应该是唯一的,但是,如果我想更新该字段,这是否适用?还是仅用于创建字段?
【解决方案2】:

假设你有一些钥匙在桌子上,你最初的陈述是:

UPDATE dbo.foo SET Email = @Email WHERE Key = @key;

然后你可以先检查值:

IF EXISTS (SELECT 1 FROM dbo.foo WHERE Email = @Email AND Key <> @Key)
BEGIN
  RAISERROR('Sorry, that e-mail is already in use.', 11, 1);
END
ELSE
BEGIN 
  UPDATE dbo.foo SET Email = @Email WHERE Key = @key;
END

现在,无论如何你都应该对表有一个约束,例如

ALTER TABLE dbo.foo ADD CONSTRAINT UQ_Email
 UNIQUE(Email);

但首先检查违规仍然是有益的,即使有约束as I demonstrated here

【讨论】:

    【解决方案3】:

    我的第一个建议是将其定义为表中的唯一列 see this。或者,我认为这不是一个很好的方法(但也许由于某种原因你不控制表)你可以在你的插入语句中检查这个。如果您能提供更多信息(表结构/插入语句)我将能够为您提供更好的答案。

    【讨论】:

      猜你喜欢
      • 2022-07-27
      • 2016-08-20
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 2015-07-02
      • 2011-08-30
      相关资源
      最近更新 更多