数据库如何保证主键唯一性?

哦,我给大家讲讲数据库的主键。
刚入行的时候,早年我确实被这个东西忽悠了很多次。

以我2 008 年在上海做的电子商务项目为例。
早期,必须使用 UUID 作为主键。
但你仔细想想,几万条数据,SQL语句看起来像什么,查询效率也极其缓慢。
你看后台日志,有一半是因为这个。
后来只好改了,换成了自增主键。
嗨,那太棒了!插入一条数据需要几毫秒,没问题。

主键约束可以由数据库本身处理。
像MySQL一样,获得一个主键,它会为你创建一个唯一索引并向其中插入重复值?直接报错,1 06 2 ,那个错误码让我印象深刻。
我调试到半夜,翻了手册才找到一个1 06 2
唯一索引是相等的,不一定是主键,比如idx_username,创建一个UNIQUE INDEX,用户名不能重复,这个大家都知道。
但关键是你需要知道哪个字段需要这个限制,否则数据太多就会卡住。

编程时要更加小心。
2 01 0年,我在北京参与了另一个项目,在那里我编写了Java并使用了JDBC。
白痴老板坚持让我在插入的时候手动设置主键值,还说可以优化性能。
结果呢?插入一半数据,主键冲突,崩溃了。
那次我一晚上都没有睡好。
后来我改了,使用PreparedStatement,不指定主键值,让数据库自己生成。
这有效。
每次看到 SQLIntegrityConstraintViolationException 都会让我头疼。

UUID,我敢说,除了分布式系统场景,不要盲目使用。
我2 01 2 年在深圳做过那个系统,有数百个节点,每个节点生成一个UUID。
一开始我觉得还不错,但是随着数据量的增加,数据库压力很大,查询速度变慢。
后来我不得不想办法优化它,这花了一些时间。

复合主键也很麻烦。
就像order_id和product_id的组合一样,查询的时候还要一起查,并不比单个主键方便。
但有些业务场景必须用到它,比如订单中的产品项,必须有复合主键,否则无法区分。

您需要更加小心并发控制。
2 01 4 年在杭州做一个高并发的项目,后端交易系统。
如果主键出现问题,损失将是巨大的。
当时用的是InnoDB。
它的聚集索引把主键放在第一位,查询速度非常快。
但是同时插入的时候,要知道它会锁表,不然数据就会乱。
那段时间确实每天都在考虑数据库优化和锁定机制。

最后说实话,主键自增是最简单、最可靠的,别乱搞。
对于分布式系统,UUID 或 Snowflake ID 都可以,但这取决于您的系统架构。
对于重要的业务表,比如订单、用户等,建议使用数据库自​​增,然后添加唯一索引,应用层可以捕获异常。
不要为所有花里胡哨的东西而烦恼,只要让它发挥作用即可。

不同数据库的实现其实是有差异的。
比如MySQL的InnoDB自带聚集索引,主键就是索引,而Oracle可能需要序列+唯一约束,这这有点复杂。
这个我不敢乱说,要看具体情况。

总之,数据库主键问题既复杂又简单。
关键是你要清楚自己的业务场景需要什么,不要乱搞。
如果掉入陷阱,要迅速改变,不要反抗。

数据库中的主键、超建、候选键、外键是什么?

2 02 2 年,我还在那个城市的公司工作,每天对着电脑,数据库的东西真是烦人。
主键是表中唯一的键,它不能为空,它就像一个ID号。
一只手表,不能再多了。
在我们2 02 2 年的项目中,将使用用户的电子邮件地址作为主键,因为该地址不会改变并且相当唯一。

超级键是一堆可以区分单行的字段,可能有点大。
例如,在用户个人资料中,电子邮件地址可以唯一地标识用户。
这个关节非常关键。
但电子邮件本身也足够独特,可以成为关键候选者。

候选键是所选超级键中最小的,并且不能再小。
寻址候选键和主键。
有时一个表有多个候选键。
例如,电话号码可以是唯一的,但通常选择最简单的一个作为主键。
外键是表之间的链接。
枕头本身应该像枕头一样。
这是代表客户表主键的外键。
在我们的 2 02 2 系统中,订单表使用客户 ID 作为外键,这样我们就可以知道谁下了每个订单。
如果客户ID不在客户表中,则无法将记录添加到订单表中。
这就是数据完整性。

一开始看不懂,感觉外键限制太多。
后来我才知道,原来没有外键,数据都是旅行者。
2 02 2 年,由于我们公司没有正确使用外键,出现了各种数据错误,损失了很多钱。
也许不久前,我觉得这些约束很麻烦,但现在我知道如果没有它们会更麻烦。

在数据库中的外键与主键的关系是什么?为什么要设外键?

嘿,主键是表中的一个字段,每条记录都不同,不能为空。
例如,2 02 2 年,我在北京的一家公司网站后端工作。
有一个用户表,用户ID是主键。
每个用户都是唯一的,不能相同或没有此 ID。

那么外键就是另一个表中与这个表中的字段相匹配的字段。
仍然是用户表,还有一个订单表。
订单表中有一个用户 ID 字段。
该字段为外键,表示用户表中主键的用户ID。
这样,对于每一个订单,你都可以知道是谁下的订单。

例如,2 02 2 年,我在上海开发一个电子商务系统,产品表和订单表使用外键链接。
产品表有一个产品 ID 作为主键,订单表有一个产品 ID 作为外键,它指向产品表。
这样,当您查看订单时,您就会知道您购买了什么产品。

外键的好处是可以保证数据不会乱。
例如,您不能输入订单中不存在的产品 ID。
数据库会检查,如果产品表中没有这个ID,则不会保存订单。
这可以防止数据错误。

而且,外键还可以简化查询。
例如,如果想知道用户购买了哪些产品,可以直接使用用户ID查看orders表中的外键,就可以找到所有订单。
无需在产品列表中一一搜索。
这样效率要高得多。

此外,外键还可以防止意外删除。
例如,商品列表中有一款热门商品,并且有很多订单与之关联。
如果直接删除这个产品ID,数据库将不允许删除,因为orders表中有一个外键指向它。
在删除产品之前,必须处理所有订单中的此外键。
这样可以保证数据不会突然消失。

所以你看,主键和外键,一是保证记录唯一,二是保证表之间的关系匹配。
好好利用它们,数据就会更有条理。

主键和唯一索引的区别

主键是唯一的约束。
唯一索引不是主键。
主键不允许空值。
唯一索引允许空值。
主键用作外键。
唯一索引不需要是外键。
表有一个主键。
表上的多个唯一索引。
在主键上创建自动聚集索引。
唯一索引可以是聚簇的,也可以不是聚簇的。
删除主键、删除外键、删除索引。
删除单个索引只会删除该索引。
主键查询效率高。
唯一索引查询效率较低。