05 | 主键:如何正确设置主键?
业务字段做主键
- 深入了解
- 翻译
- 解释
- 总结
MySQL主键设置对于数据表的准确性和查询效率至关重要。本文介绍了三种设置主键的思路:业务字段做主键、自增字段做主键和手动赋值字段做主键。通过实际案例详细讲解了如何为会员信息表设置主键,以确保唯一标识会员信息。作者建议尽量不使用业务字段作为主键,因为无法预测业务需求可能导致字段重复或重用。文章通过示例展示了使用业务字段作为主键可能导致数据不一致的问题。同时,文章提到了自增字段作为主键的思路,为读者提供了更好的理解和选择主键的思路。这篇文章内容简洁明了,适合读者快速了解MySQL主键设置的技术特点。 文章总结了设置数据表主键的三种方式:业务字段做主键、添加自增字段做主键,以及添加手动赋值字段做主键。作者建议尽量避免使用业务字段做主键,因为无法预测未来业务需求可能导致字段重复或重用的情况。自增字段做主键适用于单机系统,但在多台服务器情况下可能会出现主键重复问题。最后,提出了手动赋值字段做主键的解决方案,通过一定的逻辑确保字段值在全系统的唯一性,避免主键重复问题。总结强调了在复杂系统中,尽量给表加一个字段做主键,采用手动赋值的办法,虽然系统开发的时候麻烦一点,却可以避免后面出现大问题。 文章还提出了一个思考题,引导读者思考如何实现将销售流水表中所有单位是“包”的商品的价格改成原来价格的80%。这样的思考题可以激发读者的思考和讨论,增加了互动性和参与度。
《MySQL 必知必会》,新⼈⾸单¥59
全部留言(24)
- 最新
- 精选
- 朱晓峰置顶你好,我是朱晓峰,下面我就来公布一下上节课思考题的答案: 上节课,我们学习了数据表中数据的增删改查操作,下面是思考题的答案; 添加商品表中记录的时候,可以判断一下,如果发现itemnumber不连续,可以通过显式指定itemnumber值的办法插入数据,而不是省略itemnumber让它自增。2021-04-2171
- 李鸣关于门店新加会员的id冲突,我们是不是可以通过加上门店编号来解决,不需要每次都去总部mysql去搜一遍
作者回复: 不建议通过给id增加与业务有关的信息解决问题,比如门店编号,原因是门店编号也是有可能会重复或者重用的
2021-03-2238 - 王建老师好, 1. 既然门店客户端能够更新总部数据库为啥还要把数据放到本地呢。 2. 每次插入数据都要去总部管理信息表获取ID,插入后还要更新总部管理信息表,这个管理信息表会导致资源争用,在数据并发请求高的时候肯定会出现阻塞或者更新失败的情况吧。 3. 主键使用varchar类型,使用UUID 或者雪花ID 生成随机字符串做主键是不是更好一点呢。
作者回复: 1. 主要原因是门店的网络状况不稳定,为了支持断网销售,所以先把数据存在本地 2. 添加会员操作的频率还是比较低的,出现阻塞的风险不大 3. UUID,雪花ID都是不错的办法,但是实施成本比较高,
2021-03-2986 - 右耳朵猫咪如果是多个门店同时添加会员信息呢?那么这些门店查询的max_id是一样的,添加会员的id也是一样的了,即max_id+1。
作者回复: 需要用事物,防止别的连接读取到错误的信息
2021-03-1864 - T以业务字段做主键还有一个后果就是,索引的叶子结点中的内容占用空间可能会比较大,一个页面可能能放入的数据更少了
作者回复: 存在这种可能性
2021-06-293 - giteebravo交作业了: update domo.trans set price = price * 0.8 where itemnumber in (select itemnumber from demo.goodsmaster where unit = '包');
作者回复: 请参考我发布的参考答案
2021-03-1843 - SharpBB1.业务字段做主键 会员卡做主键 如果会员退卡 商家把卡发给另一个人 就可能导致查询出差错 手机号做主键 存在运营商回收手机号的情况 身份证号做主键 虽然是唯一的 但用户不大想填身份证 所以尽量不要用业务字段做主键 可能存在复用的情况 2.使用自增字段做主键 删除主键约束 ALTER TABLE demo.membermaster DROP PRIMARY KEY; 一般情况下只有一个数据库服务器是可以的 但存在多个门店用不同数据库 进行汇总 主键会存在冲突 3.手动赋值字段做主键 在总部表中维护一个会员最大id字段 每次新增会员就在最大id基础上+1 再进行插入 总结 单数据库系统 自增字段做主键就可以了 分布式系统 可以考虑全局生成唯一id 如雪花算法
作者回复: 好的
2022-02-092 - Ethan New主键就是要唯一的定位到一条数据,使用自增主键还是自己指定主键要看项目是单机系统还是分布式系统。如果是单机的,自增主键完全没有问题。如果是分布式的,一般在业务层自己生成全局唯一id,插入到数据库。
作者回复: 是的
2021-04-1122 - GLADIATORmysql> SELECT b.membername,c.goodsname,a.quantity,a.salesvalue,a.transdate -> FROM demo.trans AS a -> JOIN demo.membermaster AS b -> JOIN demo.goodsmaster AS c -> ON (a.memberid = b.id AND a.itemnumber=c.itemnumber); 针对这个报表关联有个疑问,那就是自增ID适不适合做业务含义?针对本例是因为前面存量数据通过update保证a.memberid = b.id;但是后续增量如何保证memberid和id关联呢?因为自增ID随时可能不连续,任何事务回滚,数据库重启等都会导致自增不连续。
作者回复: 一旦我们定义了自增字段id为会员信息表的主键,那么后继的会员消费,自然都会记录对应会员的id,因此也就不会出现因为不连续而无法关联的问题了。
2021-08-2521 - lesserror目前的业务都是使用自增主键的场景为主,偶有使用业务字段的老项目。采用自定义主键的方式还没有尝试过。 另外,希望课程中的MySQL的执行语句和执行结果输出能够分开展示。或者去掉命令行中的一些特殊字符。复制代码的时候复制的是整个命令行的字符,体验不是太好。望采纳~_~。
作者回复: 你的建议非常好,谢谢!
2021-03-191