首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当存在其他唯一字段时,为什么要使用自动递增的主键?

当存在其他唯一字段时,为什么要使用自动递增的主键?
EN

Stack Overflow用户
提问于 2010-11-05 11:42:58
回答 10查看 9.4K关注 0票数 47

我正在选修一门名为“数据库系统”的课程,对于我们的课程项目,我必须设计一个网站。

下面是我创建的一个表的示例:

CREATE TABLE users
(
  uid INT NOT NULL AUTO_INCREMENT,
  username VARCHAR(60),
  passhash VARCHAR(255),
  email VARCHAR(60),
  rdate DATE,
  PRIMARY KEY(uid)
);

教授告诉我"uid“(用户id)是完全无用和不必要的,我应该使用用户名作为主键,因为没有两个用户可以有相同的用户名。

我告诉他使用用户id对我来说很方便,因为当我调用像domain.com/viewuser?id=5这样的东西时,我只需用:is_numeric($_GET['id'])检查参数...不用说,他并不信服。

因为我已经在大量的教程中看到了user_id和其他类似的属性(thread_id、comment_id等),并且查看了流行软件的数据库模式(例如。肯定还有很多其他(更强大的)原因。

所以我的问题是:你如何证明需要一个不为空的自动递增id作为主键,而不是使用另一个属性,比如用户名?

EN

回答 10

Stack Overflow用户

发布于 2010-11-05 11:46:13

如果用户名是主键,并且用户更改了他/她的用户名,则需要更新所有具有对users表的外键引用的表。

票数 16
EN

Stack Overflow用户

发布于 2010-11-05 20:06:50

如果你已经向你的教授证明,为每个用户分配一个唯一的任意整数对你的应用程序是有价值的,那么他说这是“完全无用和不必要的”,当然是错误的。

然而,也许你没有理解他的意思。如果他告诉你的要求是“两个用户不能有相同的用户名”,那么你就没有满足这个要求。

真诚的感谢你张贴你的SQL,它是非常有用的,但大多数人不会为此而烦恼。

使用您的表,我可以这样做:

INSERT INTO users (username) VALUES (NULL);
INSERT INTO users (username) VALUES (NULL);
INSERT INTO users (username) VALUES (NULL);
INSERT INTO users (username) VALUES (NULL);
INSERT INTO users (username) VALUES (NULL);

这将导致以下结果:

SELECT uid, username, passhash, email, rdate 
FROM users;

uid   username   passhash   email   rdate
1     <NULL>     <NULL>     <NULL>  <NULL>
2     <NULL>     <NULL>     <NULL>  <NULL>
3     <NULL>     <NULL>     <NULL>  <NULL>
4     <NULL>     <NULL>     <NULL>  <NULL>

我认为这就是你的教授试图表达的观点:如果不在username上强制使用自然密钥,你就根本没有任何数据完整性。

如果我是教授,我也会敦促你从你的设计中删除可以为空的列。

票数 11
EN

Stack Overflow用户

发布于 2010-11-05 11:53:24

这通常被称为surrogate key,它有很多优点。其中之一是将数据库关系与应用程序数据隔离。更多细节和相应的缺点可以在上面提供的wiki链接中找到。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4103433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档