我应该选择哪个字段作为主键?

时间:2013-08-20 11:46:58

标签: php

如果我在网页上有登录表单,我该怎么办?它提示我输入一个电子邮件作为用户名&密码。如果我设计这样的网页,我应该将该电子邮件作为主键吗?因为我在用户注册期间没有给用户一个字段,所以他/她可以输入任何可以进一步选择作为主键的整数ID。我还有其他表属于这个用户&我需要加入以检索所有细节。在这种情况下,我如何管理主键。我不能把它自动生成,因为这也需要同时在其他表中输入,这是自动id无法实现的。

需要帮助?

6 个答案:

答案 0 :(得分:2)

您仍应使用auto increment作为主键。 (并在电子邮件地址列上设置UNIQUE CONSTRAINT。)

当用户通过您的表单登录时,您应该获取相关的行,并在会话期间(用户登录的时间)将其保存在某处:

SELECT * FROM users WHERE email='johndoe@example.com' AND PASSWORD=SHA1('secret');

然后,它会为您提供应在应用程序中的其他位置使用的数据

修改

如果您有2个表,1个包含用户,1个包含其个人资料,则这两个表之间存在一对一关系。这意味着两个表中的一个应该与另一个表有关系,在一对一的情况下,最好从另一个表中引用拥有表。由于用户拥有个人资料,这将归结为:

user (id, email, password);
profile(id, user_id, contact, address);

要选择两者,您可以使用共享密钥加入它们:

SELECT * FROM user JOIN profile ON user.id = profile.user_id;

虽然在这种情况下甚至可以重用user_id,作为配置文件表的PRIMARY KEY。 (对于一对一的关系来说,这本质上是正确的,但如果您选择重新设计结构,可能会让您遇到麻烦......)

要详细了解FOREIGN KEYS,请参阅MySQL Documentation

请注意,您没有需要将外键指定为约束,您只需创建列,并以编程方式确保值正确且一致。但约束有许多优点:

  • 它将确保没有悬空行(如果配置正确)
  • 它可以为您(ON DELETE CASCADE
  • 删除子行
  • 您无法将键插入不存在的引用
  • 一些ORM可以直接从架构中读取关系

答案 1 :(得分:1)

您可以将整数id设置为主键。首先,您必须更新用户表,然后对于插入记录,您可以获得id值,然后您可以在其他表中插入其他用户相关信息。 Email将是唯一的,因此您必须在插入任何用户之前检查是否存在电子邮件地址。我想这会对你有帮助。

答案 2 :(得分:1)

请使用自动递增的整数列作为用户表的主键。 使用该ID作为引用记录。您可以验证电子邮件的唯一性。

答案 3 :(得分:0)

只有id应该是主键并自动递增它。您不应该将电子邮件作为主键。在注册之前,请检查电子邮件ID是否已存在。如果存在限制注册和重定向,则允许注册。

EG。注册表字段:id,name,email,password

用户个人资料信息字段:id,user_id,age,....

查询

select * from reg_table a inner join profile_info b on a.id=b.user_id where a.id=1

答案 4 :(得分:0)

你应该使用一个整数。因为这是您的用户引用,所以在更改邮件地址时,您必须更新所有引用表。

答案 5 :(得分:0)

磁盘空间不再像往常那样溢价,所以,另一个想法,一点争议的想法是你使用GUIDS作为主键,因为它们允许轻松合并数据库而变得更受欢迎。