首页
学习
活动
专区
圈层
工具
发布

mysql 什么是主键

主键(Primary Key) 是关系型数据库管理系统(RDBMS)中的一个核心概念,用于唯一标识表中的每一行记录。主键具有以下几个基础概念和特性:

基础概念

  1. 唯一性:主键的值必须是唯一的,不允许出现重复。
  2. 非空性:主键的值不能为空(NULL)。
  3. 单一性:一个表只能有一个主键,但可以由一个或多个字段组成。

优势

  • 唯一标识:主键用于唯一标识表中的每一行记录,便于数据的检索和管理。
  • 数据完整性:通过主键可以确保数据的唯一性和完整性,避免数据冗余和不一致。
  • 索引优化:数据库系统通常会对主键进行索引优化,提高查询效率。

类型

  1. 单字段主键:由单个字段组成的主键。
  2. 单字段主键:由单个字段组成的主键。
  3. 复合主键:由多个字段组成的主键。
  4. 复合主键:由多个字段组成的主键。

应用场景

  • 用户管理:在用户表中,通常使用用户ID作为主键。
  • 订单管理:在订单表中,可以使用订单ID和用户ID的组合作为复合主键。
  • 商品管理:在商品表中,可以使用商品ID作为主键。

常见问题及解决方法

  1. 主键冲突:当尝试插入重复的主键值时,会引发主键冲突错误。
  2. 主键冲突:当尝试插入重复的主键值时,会引发主键冲突错误。
  3. 解决方法:确保插入的主键值唯一,或者修改表结构,使用自增字段作为主键。
  4. 主键为空:尝试插入空值到主键字段时,会引发错误。
  5. 主键为空:尝试插入空值到主键字段时,会引发错误。
  6. 解决方法:确保主键字段不为空,或者在插入数据时提供有效的非空值。
  7. 主键选择:选择合适的主键类型可以提高数据库性能和数据完整性。
    • 自增字段:使用自增字段(如AUTO_INCREMENT)作为主键,可以简化插入操作。
    • 自增字段:使用自增字段(如AUTO_INCREMENT)作为主键,可以简化插入操作。
    • UUID:使用全局唯一标识符(UUID)作为主键,可以避免跨数据库的主键冲突。
    • UUID:使用全局唯一标识符(UUID)作为主键,可以避免跨数据库的主键冲突。

参考链接

通过以上内容,您可以全面了解MySQL中主键的概念、优势、类型、应用场景以及常见问题的解决方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

MySQL为什么需要主键

MySQL为什么需要主键主键表中每一行都应该有可以唯一标识自己的一列(或一组列)。一个顾客可以使用顾客编号列,而订单可以使用订单ID,雇员可以使用雇员ID或雇员社会保险号。...表中的任何列都可以作为主键,只要它满足以下条件:任何两行都不具有相同的主键值。每个行都必须具有一个主键值(主键列不允许NULL值)这里列出的条件是MySQL本身强制实施的。...除MySQL强制实施的规则外,应该坚持的几个普遍认为的最好习惯为:不更新主键列的值。不重用主键列的值。不在主键列中使用可能会更改的值。比如用用户邮箱当主键,但是用户可能更换邮箱。...如果使用非自增主键:由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置:此时MySQL不得不为了将新记录插到合适位置而移动数据。...如果没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并一次作为主键。MySQL在频繁的更新、删除操作时,会产生碎片。而含碎片比较大的表,查询效率会降低。

2.7K00

MySQL为什么要给表加上主键

如果给表上了主键,那么表在磁盘上的存储结构就由整齐排列的结构转变成了树状结构,并且是「平衡树」结构,换句话说,就是整个表就变成了一个索引。...这就是为什么一个表只能有一个主键,一个表只能有一个「聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置。   ...50000, 90000)   plt.plot(x_data, y_data) 3.给表中多个字段加上常规的索引,那么就会出现多个独立的索引结构.字段中的数据就会被复制一份出来,用于生成索引,叶子节点是主键...,下面就是一个主键和三个常规索引的结构 4.通过主键去查,叶子节点就是数据行 5.通过其他索引字段去查,那么叶子节点是主键ID,然后再去根据主键查,聚集索引(主键)是通往真实数据所在的唯一路径 7...不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql

3.2K20
  • 为什么MySQL的主键查询这么快

    能啊,这篇文章的题目就是关于主键啊,我们可以按照主键的顺序,从小到大来串联当前数据页中的所有记录。事实上,MySQL的设计者也确实是这么设计的。...如果你足够叛逆,你可能会想,你不设置主键的话是不是MySQL就崩了啊?...番外:为什么推荐使用自增ID作为主键,而不推荐使用UUID?...说到这,顺便谈一谈为什么推荐使用自增ID作为主键,而不推荐使用UUID?除了UUID主键索引占据大量空间的问题之外,在插入数据的资源开销上,自增ID也远小于UUID。...但是对于我们这篇文章的主题——MySQL的主键查询为什么这么快,只能算是回答了一半,毕竟在数据页中进行搜索的前提是你得先找到数据页啊。这就是每次面试必问的MySQL索引的知识了,下一篇文章再介绍吧。

    4.7K92

    MySQL自增主键为什么不连续

    自增主键可以让主键索引尽量的保持递增顺序插入,避免页分裂,索引更加紧凑。 自增主键保存在何处?...不同的引擎对于自增值的保存策略不同: MyISAM引擎的自增值保存在数据文件中 InnoDB引擎的自增值保存在内存里,但是在MySQL8.0以后,该自增值才可以被持久化:MySQL5.7以前,自增值没有持久化每次重启后第一次打开表的时候...,当前的自增值是Y: 如果X<Y,表的自增值不变 如果X>=Y,需要把当前自增值修改为新的自增值 新的自增值生成算法 从auto_increment_offset(默认值是1)开始,以auto_increment_increment...(默认值是1)为步长,持续叠加,直到找到第一个大于X的值,作为新的自增值 唯一键冲突导致自增主键不连续 insert into t values(null, 1, 1); 执行器调用InnoDB引擎写入一行...事务回滚为什么自增值不能回退 两个并行的事务在申请自增值的时候,为了避免两个事务申请到相同的自增id,需要加锁按照顺序申请,如果自增值可以回退需要做一些特殊处理: 每次申请id之前,判断表里此id是否存在

    9.7K20

    mysql为什么建议使用自增主键

    前面我写了几篇关于 mysql 索引的文章,索引是 mysql 非常重要的一部分。...但是如果你要弄明白什么是页分裂,或者什么情况下会页分裂,这个时候你就需要对 mysql 的底层数据结构要有一定的理解了。...如果主键是非自增 id,为了确保索引有序,mysql 就需要将每次插入的数据都放到合适的位置上。...其实对主键 id 还有一个小小的要求,在满足业务需求的情况下,尽量使用占空间更小的主键 id,因为普通索引的叶子节点上保存的是主键 id 的值,如果主键 id 占空间较大的话,那将会成倍增加 mysql...本来这篇文章是打算总结一下前面写的几篇关于 mysql 索引的文章的,也是打算多举几个例子的,结果发现光写了一个自增主键就写了一大堆了,然后时间也比较晚了,干脆就写到这吧,原本计划的几个其他例子后面再单独写吧

    6K31

    MySQL主键自增值为什么有“空洞”?

    最终发现了MySQL主键自增值“空洞”了 1.场景准备 测试场景为MySQL 8.0: 主键重复场景 唯一键重复场景 1、建表,包含主键及唯一约束 CREATE TABLE t1( id int(...,但如果往小的修改就要看目前数据库插入的值是否会将修改后的自增值“卡”在中间,如果出现这种情况是没办法改回去的,原因显而易见,自增属性与主键配套使用,如果现在表里id=4和id=6之间差了个5的值,将自增值改回...技术分享 | 微服务架构的数据库为什么喜欢分库分表?...MySQL内存管理机制浅析 技术分析 | 浅析MySQL与ElasticSearch的组合使用 ---- 关于 GreatSQL GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR...可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

    3.2K20

    mysql 主键自增语句_MySQL 自增主键

    自增主键的单调性 为何会有单调性的问题? 这主要跟自增主键最大值的获取方式,以及存放位置有关系。 如果最大值是通过计算获取的,并且在某些情况下需要重新获取时,会因为最新的数据被删除而减小。...自增主键最大值怎么取的?存放到哪里?...MySQL 5.7 及之前的版本,自增主键最大值会在启动(重启)后从数据库中取出放到内存: SELECT MAX(ai_col) FROM table_name FOR UPDATE; 这样获取是通过计算的...注册新账号的人以为是新手福利,笑嘻嘻。 如何解决单调性的问题? 从 MySQL 8.0 开始,自增主键最大值会在每次修改后写入到 redo log,并且在每个检查点写入引擎私有的系统表。...参考文档 为什么 MySQL 的自增主键不单调也不连续 https://database.51cto.com/art/202004/614923.htm 《MySQL技术内幕——InnoDB存储引擎》

    15.6K10

    Mysql资料 主键

    表中的任何列都可以作为主键,只要它满足以下条件: 1、任何两行都不具有相同的主键值 2、每个行都必须具有一个主键值(主键列不允许NULL值) 除MySQL强制实施的规则外,应该坚持的几个普遍认为的最好习惯为...: 1、不更新主键列的值 2、不重用主键列的值 3、不在主键列中使用可能会更改的值(例如,如果使用一个名字作为主键以标识某个供应商,应该供应商合并和更改其名字时,必须更改这个主键) 总之:不应该使用一个具有意义的...这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15...2、.如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置: 此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉...如果没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并一次作为主键。 mysql 在频繁的更新、删除操作,会产生碎片。而含碎片比较大的表,查询效率会降低。

    6.6K20

    mysql主键自增策略_MySQL 自增主键机制

    大家好,又见面了,我是你们的朋友全栈君。 自增主键:特指在自增列上定义的主键。 自增主键的优点是让主键索引保持递增顺序的插入,避免页分裂,索引更加紧凑。 1. 自增值保存在哪?...Innodb引擎,mysql5.7之前,自增值保存在内存中,而且不会持久化自增值。...每次重启后第一次打开表,都会去查找自增值的最大值max(id), 并设置表当前自增值为max(id) + 1; mysql8.0, 自增值变更记录在了redo log中,重启时依靠redo log恢复重启之前的值...为了减少自增id锁带来的性能影响,mysql不会修改回去之前的自增值; 4. 自增锁的优化 a....而对于批量插入数据的语句(select … insert,replace … select 和 load data 语句),MySQL 有一个批量申请自增 id 的策略(注:该策略是导致自增 id 不连续的第三种原因

    13.6K50

    ⑦【MySQL】什么是约束?如何使用约束条件?主键、自增、外键、非空....

    约束 ⑦【MySQL】约束条件 1. 约束的基本使用 2. 外键约束 ⑦【MySQL】约束条件 1. 约束的基本使用 约束: 什么是约束? 约束是作用于表中字段上的规则,用于限制存储在表中的数据。...约束分类: ①非空约束 —— 限制该字段的数据不能为null NOT NULL ②唯一约束 —— 保证该字段的所有数据都是唯一、不重复的 UNIQUE ③主键约束—— 主键是一行数据的唯一标识,要求非空且唯一...CHECK ⑥外键约束—— 用来让两证表的数据之间建立连接,保证数据的一致性和完整性 FOREIGN KEY ⑦自增约束 AUTO_INCREMENT -- 案例 /* 创建表 ID唯一标识:id、int、主键且自增...在父表进行更新/删除时,首先检查记录是否存在外键,存在则同时对外键关联的子表进行相应的更新/删除 SET NULL:在父表进行更新/删除时,首先检查记录是否存在外键,存在则将外键关联的字段值设置为null(前提是外键关联字段可以为

    2K100

    MySQL的主键详解

    表中的任何列都可以作为主键,只要它满足以下主键值规则条件: 任两行不具相同的主键值 每行都必须具有一个主键值(主键列不允许NULL) 这里的规则是MySQL本身强制实施的。...除MySQL强制实施的规则外,还应该坚持的最佳实践: 不更新主键列中的值 不重用主键列的值 不在主键列中使用可能会更改的值 例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其 名字时...,必须更改这个主键) 联合主键 好处 可以直观的看到某个重复字段的记录条数 主键A跟主键B组成联合主键 主键A跟主键B的数据可以完全相同,联合就在于主键A跟主键B形成的联合主键是唯一的。...此时上述的条件必须应用到构成主键的所有列,所有列值的组合必须是唯一的(多列中的单个列的值可以不唯一)。...超键包含候选键和主键。 候选键 是最小超键,即没有冗余元素的超键。 外键 在一个表中存在的另一个表的主键称此表的外键 主键的选择 代理主键(推荐使用) 与业务无关的,无意义的数字序列。

    7.9K20

    MySQL之什么是MySQL

    这篇教程是帮助你回答:什么是MySQL?以及告诉你为何 MySQL 是世界上最流行的开源数据库的原因。...在了解MySQL之前,要先了解database和SQL,若你已经了解它俩,则可以直接跳到:什么是MySQL?...数据库无处不在,那数据库到底是什么呢?根据定义,一个数据库只不过是数据化的集合。 数据之间有关联是很自然的,比如:一个商品隶属于一个商品分类同时关联很多标签。因此,我们称之为关系数据库。...现在,你了解了数据库和SQL,是时候回答下一个问题… MySQL是什么? My是 MySQL的联合创始人女儿 Monty Widenius的名字。 MySQL就是My 和 SQL 的组合。...如果你建设网站或者Web应用,MySQL是很好的选择。MySQL是LAMP的必要组件,其中包括Linux、Apache、MySQL、PHP。

    1.9K40

    MySQL主键设计盘点

    主键设计和应用原则 除了满足MySQL强制实施的规则(主键不可重复;一行中主键不可为空)之外,主键的设计和应用应当还遵守以下公认的原则: 不更新主键列中的值; 不重用主键列的值; 不在主键列中使用可能会更改的值...3、ID作为主键时在特定的环境会存在一些问题,比如需要排序的时候——UUID是无序的。 4、MySQL官方有明确的建议主键要尽量越短越好,36个字符长度的UUID不符合要求。...5、对MySQL索引不利:作为数据库主键,在InnoDB引擎下,UUID的无序性可能会引起数据位置频繁变动,严重影响性能。...关于MySQL 使用自增ID主键和UUID 作为主键的性能比较可以查看参考【8】。 结论: 1、uuid做主键适用于小规模分布式架构用。...结论: 用自建的id生成器做主键适用于大规模分布式架构 参考: 【1】:红心李 :MySQL主键设计 【2】:Uncle Nucky :MySQL数据库主键设计原则 【3】:ellis:设计套路:Mysql

    6.5K30

    为什么MySQL不推荐使用uuid作为主键?

    前言 在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一,单机递增),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用...uuid,使用uuid究竟有什么坏处?...那么为什么会出现这样的现象呢?...带着疑问,我们来探讨一下这个问题: 二、使用uuid和自增id的索引结构对比 2.1.使用自增id的内部结构 [1240] 自增的主键的值是顺序的,所以Innodb把每一条记录都存储在一条记录的后面。...当达到页面的最大填充因子时候(innodb默认的最大填充因子是页大小的15/16,会留出1/16的空间留作以后的修改): ①下一条记录就会写入新的页中,一旦数据按照这种顺序的方式加载,主键页就会近乎于顺序的记录填满

    5.9K30

    什么是MySQL 视图

    什么是MySQL 视图定义视图是一种虚拟表,是一个逻辑表,本身并不包含数据,通过select语句去基本表上动态生成数据。...name, salaryFROM employeesWHERE department = '技术部';现在你可以像查询一张表一样使用这个视图:SELECT * FROM tech_employees;为什么使用视图封装复杂查询...[WITH CASCADED | LOCAL CHECK OPTION]:表示视图在更新时保证在视图的权限范围之内cascade是默认值,表示更新视图的时候,要满足视图和表的相关条件。...select语句包含以下任意一项,视图就不能被更新:聚合函数或窗口函数(SUM()、MIN()、MAX()、COUNT()等)DISTINCTGROUP BYHAVINGUNION 或者 UNION ALL总结MySQL...视图是数据库中的虚拟表,它不存储实际数据,而是基于SELECT语句动态生成结果。

    34111
    领券