使用唯一字段进行更新

时间:2017-10-27 20:21:43

标签: mysql

我正在使用MySQL,而且我目前有一个如下所示的数据表:

+---------+-----------------+-------------------+-----------+
| user_id |      email      |      password     | is_active |
+---------+-----------------+-------------------+-----------+
|    1    | admin@admin.com | [hashed_password] |     0     |
+---------+-----------------+-------------------+-----------+
|    2    |  user@user.com  | [hashed_password] |     0     |
+---------+-----------------+-------------------+-----------+

user_id是主要的,唯一的,自动递增的字段,email是唯一字段。

我想允许用户更新他们的电子邮件地址和密码,我遇到的问题是构造我的SELECT语句以验证所需的email是否尚未使用以及是否已在使用然后使用,确保user_id匹配。

例如,如果user_id#2的人决定提交以下值:

Values:
+---------+-----------------+--------------------+-----------+
| user_id |      email      |      password      | is_active |
+---------+-----------------+--------------------+-----------+
|    2    | admin@admin.com |      new value     |     0     |
+---------+-----------------+--------------------+-----------+

结果应返回False,因为admin@admin.com#1存在user_iduser_id的值为2

Values:
+---------+-----------------+--------------------+-----------+
| user_id |      email      |      password      | is_active |
+---------+-----------------+--------------------+-----------+
|    2    |  user@user.com  |      new value     |     0     |
+---------+-----------------+--------------------+-----------+

结果应返回True,因为即使{1}}存在user_id#2,user@user.com的值也与电子邮件已属于的值相匹配

我尝试了以下代码,并在上面的示例中返回了#2中的值,但在#1中它根本没有返回值:

user_id

2 个答案:

答案 0 :(得分:0)

Select  email, user_id, if(user_id = 2, 1, 0) as owner from user where email ="admin@admin.com"

如果当前用户(Id 2)拥有已检查的电子邮件列所有者将返回1,否则为0

但如果你真的想通过查询来检查它(这不是个好主意)......

Select 
If(u2.email is null or u1.user_id = u2.user_id, 1, 0) as result
From user u1
Left join user u2 on (u2.email = "admin@admin.com" )
Where u1.user_id = 2

因此您需要查询电子邮件和用户ID。 注意:我没有测试查询,因此可能存在错误。它只是方法的例子

答案 1 :(得分:0)

您不需要先检查。只是尝试执行UPDATE。如果电子邮件在另一行中使用,由于email列上的唯一索引,这将失败。您可以测试该错误并报告该电子邮件正在使用中。

如果您按自己的方式执行操作,则需要在SELECTUPDATE查询之间使用交易,否则有人可能会在它们之间插入并使用所需的电子邮件创建一行。