1. 作用

  • 从业务上来说
    在设计数据库时不需要费尽心思去考虑设置哪个字段为主键。然后是这些字段只是理论上是唯一的,例如使用图书编号为主键,这个图书编号只是理论上来说是唯一的,但实践中可能会出现重复的 情况。所以还是设置一个与业务无关的自增ID作为主键,然后增加一个图书编号的唯一性约束。
  • 从技术上来说
    如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。 总的来说就是可以提高查询和插入的性能。
  • 对InnoDB(数据存储引擎)来说
  1. 主键索引既存储索引值,又在叶子节点中存储行的数据,也就是说数据文件本身就是按照b+树方式存放数据的。
  2. 如果没有定义主键,则会使用非空的UNIQUE键做主键 ; 如果没有非空的UNIQUE键,则系统生成一个6字节的rowid做主键;
    聚簇索引中,N行形成一个页(一页通常大小为16K)。如果碰到不规则数据插入时,为了保持B+树的平衡,会造成频繁的页分裂和页旋转,插入速度比较慢。所以聚簇索引的主键值应尽量是连续增长的值,而不是随机值(不要用随机字符串或UUID)。
    故对于InnoDB的主键,尽量用整型,而且是递增的整型。这样在存储/查询上都是非常高效的。

2. 业务主键和非业务主键

  • 自增字段作为主键(一般多用int类型定义),也称为非业务主键(逻辑主键或者代理主键)意思就是这列数据与业务无关,仅仅作为主键而设计,会浪费主键资源。

3. sqlserver修改主键为自增

  • 先删除id字段, 执行下面sql即可:
    alter table 表名 add id int IDENTITY (1,1) PRIMARY KEY
    如果在navicat中需要移动id字段位置,可以将其他字段复制粘贴到id字段,再将id字段前的删除

4. 优缺点

自增主键 业务主键
优点 1. 索引所占空间小
2. 增删改查效率高
3.业务变化不需要更新主键
1. 保证业务逻辑的完整性
2. 安全性高
3.可以转移数据库
缺点 无法转移数据库 1. 效率低
2.业务变化需要修改主键

仅作个人笔记,参考博主

  • https://www.cnblogs.com/lanqi/p/10185172.html
  • https://blog.csdn.net/hao_0514
  • 百度词条

id主键的创建及作用相关推荐

  1. mysql 联合主键_Mysql 创建联合主键

    Mysql 创建联合主键 2008年01月11日 星期五 下午 5:21 使用primary key (fieldlist) 比如: create table mytable ( aa int, bb ...

  2. mysql支持UUID做外键_多表外键下将普通的id主键更新为uuid主键

    多表外键下将普通的id主键更新为uuid主键 2019-05-20 02:45:37 来源: 晴天小雨 0 摘要:在多表外键影响和保证数据不删除的前提下,借助Flask-sqlalchemy插件及SQ ...

  3. python字典添加主键_Python--MySql(主键的创建方式、存储引擎、存储过程、索引、pymsql)...

    主键的创建方式 1. create tablestud( idint not null unique, namevarchar(20) ); mysql> descstud;+-------+- ...

  4. MySQL 使用自增ID主键和UUID 作为主键的优劣比較具体过程(从百万到千万表记录測试)...

    測试缘由 一个开发同事做了一个框架.里面主键是uuid.我跟他建议说mysql不要用uuid用自增主键,自增主键效率高,他说不一定高,我说innodb的索引特性导致了自增id做主键是效率最好的,为了拿 ...

  5. MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)...

    Reference: https://blog.csdn.net/mchdba/article/details/52336203 一个开发同事做了一个框架,里面主键是uuid,我跟他建议说mysql不 ...

  6. 数据库面试 - 分库分表之后,id 主键如何处理?

    数据库面试 - 分库分表之后,id 主键如何处理? 面试题 分库分表之后,id 主键如何处理? 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后, ...

  7. Sqlite 主键自动创建

    在用sqlite设计表时,每个表都有一个自己的整形id值作为主键,其实可以不指定这么一个id值,sqlite内部本来就会为每个表加上一个 rowid,这个rowid可以当成一个隐含的字段使用,但是由s ...

  8. Controller规范和接口定义,添加一条新数据并返回此数据的ID(主键)

    参考文章: 烂代码之:Controller规范和接口定义 添加一条新数据并返回此数据的ID(主键) 删除数据返回boolean 添加数据后返回Id <insert id="" ...

  9. php id如何设置主键自增,phpmyadmin设置id主键自增报错怎么办_数据库

    phpmyadmin啥意思_数据库 phpmyadmin是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库,如建立.修 ...

最新文章

  1. Java调用ocx控件以及dll
  2. 机器学习案例 特征组合——高帅富 冷启动——从微博等其他渠道搜集数据进行机器学习 用户年龄——线性分段处理...
  3. WP老杨解迷:可知评论系统还能勾搭用户呢
  4. [PM Tools]软件项目进度跟踪表v4.0
  5. 统计学---数据的标准化
  6. numeric比较大小 数据库_mysql大小写敏感与校对规则
  7. 历史命令与实时记录(redhat6.8)
  8. [渝粤教育] 辽宁对外经贸学院 国际集装箱多式联运 参考 资料
  9. 设计模式之单例模式(C++代码实现)
  10. Python常用数据结构之heapq模块
  11. Linux Workqueue
  12. vmp给驱动加壳的注意事项
  13. js之按键控制div移动
  14. 计算机二级Python错题
  15. delphi学习笔记(1)-object pascal语言的数据类型 选择自 xmz2629 的 Blog
  16. 拆字在线版-扌斥字在纟戋片反
  17. 关于Contiguous()方法
  18. node版本、npm版本随意切换
  19. 华为荣耀3x G750-T01 Root操作
  20. 主流hpc应用安装之QE

热门文章

  1. 10秒破解一辆特斯拉?!网安人员再曝特斯拉低级漏洞,成本只要1000块?
  2. 全国计算机报告考点,全国计算机等级考试二级Access考点分析之报表(5)
  3. java 日程安排_java实现日程表
  4. 少儿口才培训班有什么用?芒果叔叔刘老师给你分析
  5. 微博评论情感分析(NLP,LSTM)
  6. 数字芯片后端设计——Memory Complier使用及库导入
  7. 环境管理:开发、测试和生产环境
  8. slab下kmalloc内核函数实现
  9. linux下c/c++程序调试拾遗
  10. Linux 配置Nginx环境变量Nginx常用命令