mysql主键和唯一键区别?如何选择主键?

2 02 3 年,我那个朋友公司刚上线了一个新系统,结果数据表的主键设计出了点问题。
主键和唯一键,这两者有什么区别呢?首先,约束条件上,主键必须唯一且非空,而唯一键允许为空但非空值必须唯一。
数量限制上,一个表只能有一个主键,但可以有多个唯一键。
至于索引类型,主键自动创建聚集索引,查询效率最高,唯一键默认是非聚集索引,效率稍低。

上周,我帮朋友分析了他们的数据库设计,发现他们把用户的邮箱设成了唯一键,但邮箱有时候是空的。
这其实不太合适,因为唯一键是用来保证非空值的唯一性,而邮箱可以为空。
而且,他们还用了一个复杂的业务字段作为主键,比如身份证号,这个字段可能会变更,不适合做主键。

我建议他们用自增整数作为主键,这样稳定且高效。
唯一键的话,可以用来约束用户名、手机号这些字段,保证它们不会重复。
对了,他们还发现,订单表中某个字段经常被用于查询,但他们并没有将其设为主键,这其实可以优化查询效率。

你看着办,我觉得他们的数据库设计可以再优化一下。

mysql 主键可以为空吗

主键不能为空。

空值破坏唯一性。

空值导致索引混乱。

空值引发系统错误。

插入主键为空会失败。

外键关联会失效。

使用自增整数主键。

使用UUID主键。

不要用业务字段作主键。

复合主键要谨慎。

主键必须唯一非空。

mysql中如何设置两个主键

记得有一次,我帮一个朋友搭建一个电商网站的后台数据库,他想要给用户表设置两个主键,一个用户的邮箱,一个用户的手机号。
我一开始想着直接给两个字段都设置为主键,后来想了想,这不太对劲。
于是,我给他解释了复合主键的概念。

“你看,我们可以在邮箱和手机号中任选一个作为主键,但是为了防止数据重复,我们还可以将另一个字段设置为唯一约束。
”我说,“这样,两个字段都能保证数据的唯一性,但不会像复合主键那样复杂。

朋友点点头,表示明白了。
后来,我按照这个方法设置了邮箱作为主键,手机号作为唯一约束。
运行了一段时间后,网站运行得挺顺利的,用户信息也没有重复。

不过,我突然想到,如果有一天用户更换了邮箱或手机号,那原来的数据怎么办呢?这个细节我还得再考虑一下。