
新手问数据库主键的问题
主键在选择时,不仅要考虑非空、唯一这两个条件,实际上这只是最小要求。
例如我在选择主键时,就还要考虑下面的因素
简单性:例如用户的指纹就不适合拿来当主键。因为它过于复杂了。主键通常都会在多个表中做为关联字段使用的,过于复杂的主键会增加表的存储负担。
稳定性:主键的更改会给数据库系统造成灾难,所以主键一定要稳定,不会因为任何因素发生更改。所以身份证号码其实不适合拿来当主键。
业务无关性:这和稳定性相关联,只要和具体业务相关,就很难避免编码规则的更改。
独立性:一个主键必须能标识一条记录,一条记录也必须只有一个主键(或主键集)。比如电话号码就不适合当主键,虽说它也具有非空性和唯一性,但不能避免某人有多个电话卡。
在实际使用时还有一些其它原则,比如外键必须与主表的主键关联,所以尽量避免复合主键等等。这些就是在项目中体会的了。
至于主键与唯一索引的区别,从上面也可以看出来:
唯一索引字段是与业务相关的,但主键会被选择业务无关的(例如MSSQL中的标识列)
主键只能有一个,唯一索引可以有多个。
主键必须是非空的,唯一索引允许出现一个空值,这有时很有用。比如可能在用户管理表中,只有超级管理员不需要登记联系邮箱。
主键通常用于与其它表进行关联,唯一索引通常不会拿来做这件事。
非常感谢您的回答,让我对主键又有了更进一步的认识,但是如果not null unique加上简单性,稳定性,业务无关性和独立性是不是就成为了主键了呢?
呵呵,有点纠结了哈。
表里的主键通常是必须的,所以你完全可以把主键当成唯一索引来用。
问题是,有些字段不想做为主键,又要求不能有重复值,为了应付这种情况,才引入了唯一索引这个概念。

2023-08-15 广告