数据库的主键应该选择什么数据类型比较好?

之前感觉都是在用Int作为ID自增,虽然之前也见别人用varchar作为Id但是并不理解,今天发现当一个表A(新闻类别表)的主键为int的ID,且为表…
关注者
34
被浏览
103,742

6 个回答

主键的话我的建议是自增整形,不要使用与业务相关的名字,仅用id即可,而效率问题都可以用索引来解决。因为主键的不可变的特性,如果选择不慎,会在未来产生难以预期的问题。比如你用int型做文章的id,但是如果在未来某一天文章数超过了无符号整形的最大值,你将没法将主键修改成bigint。或者为了给用户起一个唯一id用了自增主键,但是如果未来有其他的项目用户要合并进来,他也是这么做的。这时候为了区分不同的项目可能要在这个用户id前加一个前缀,这时候也没法修改主键的值。主键之所以叫做主键就是到什么时候都不能改,所以最好的方案就是使用自增数字id做主键,并且不要给这个主键赋予一个业务相关的意义。

使用字符串作为主键

在本系列关于为关系数据库选择主键的第三部分也是最后一部分中,我们将研究使用字符串数据作为主键(PK)的一些原因。回想一下,在 第 1 部分 ,我们讨论了自然主键和代理主键,并考虑了什么因素决定选择哪一种。而 第 2 部分 探讨了字符串和数值数据类型,看看哪种更适合作为主键。现在是时候澄清事实并得出结论,字符串或字母数据是否合适的主键。

现成的主键

你的数据通常都会有一个合理的自然主键,它有通用含义,并且可能不是整数。如果是这样,那么仅仅为了要整数类型的主键而添加人工键只会增加冗余。在许多数据库开发人员的估计中,性能可能会受到轻微影响,但它的重要性略低于正确性、完整性和适当的建模。

字母键的一个不明显的好处是,简短的符号字符串可以简化调试,因为在数据转储(无需额外的联接)时人们能立即看得懂。例如,美国各州有一个唯一的字母代码,可作为有意义的键。此外,各个国家或地区有自己的字母 ISO 代码。还有无数其他例子,例如车辆 VIN 号码、发票 ID 等。

使用 GUID 作为主键

如果你有多个数据库,自动递增键可能会导致冗余记录。解决此问题的其中一种方法是使用 GUID。GUID是 “Globally Unique IDentifier”的缩写,它是一个 16 字节的二进制数据类型,保证在表、数据库甚至服务器之间是唯一的。

创建 GUID 的方式因不同的数据库而异,但在 SQL Server 中,NEWID() 函数的使用如下所示:

SELECT NEWID()

以下是用于创建具有 UNIQUEIDENTIFIER 数据类型的表的语句。若要为列设置默认值,我们可以使用 default 关键字并将默认值设置为 NEWID() 函数返回的值:

USE EngDB
CREATE TABLE EnglishStudents1
	Id UNIQUEIDENTIFIER PRIMARY KEY default NEWID(),
	StudentName VARCHAR (50)