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

mysql主键 唯一键

MySQL 主键与唯一键基础概念

主键(Primary Key):

  • 定义:主键是表中的一个或多个字段,其值能唯一地标识表中的每一行记录。主键列的值必须是唯一的,且不允许为空(NULL)。
  • 作用:主键用于确保数据的唯一性和完整性,同时也是数据库索引的一部分,有助于提高查询效率。

唯一键(Unique Key):

  • 定义:唯一键也是表中的一个或多个字段,其值能唯一地标识表中的记录,但允许有一个空值(NULL)。一个表可以有多个唯一键。
  • 作用:唯一键用于确保数据的唯一性,但不像主键那样要求列值不能为空。

主键与唯一键的优势

主键优势:

  • 唯一性:确保每一行数据的唯一性。
  • 索引:主键自动创建唯一索引,提高查询效率。
  • 外键约束:主键常用于定义外键,实现表与表之间的关系。

唯一键优势:

  • 灵活性:允许有一个空值,适用于某些允许空值的唯一性约束场景。
  • 多重约束:一个表可以定义多个唯一键,以满足不同的唯一性需求。

主键与唯一键的类型

主键类型:

  • 单字段主键:由单个字段组成。
  • 复合主键:由多个字段组合而成。

唯一键类型:

  • 单字段唯一键:由单个字段组成。
  • 复合唯一键:由多个字段组合而成。

应用场景

主键应用场景:

  • 用户表:用户ID作为主键,确保每个用户的唯一性。
  • 订单表:订单ID作为主键,确保每个订单的唯一性。

唯一键应用场景:

  • 邮箱验证:邮箱字段设置唯一键,确保每个邮箱地址只能注册一次。
  • 用户名:用户名字段设置唯一键,确保每个用户名只能被使用一次。

常见问题及解决方法

问题1:主键冲突

  • 原因:尝试插入重复的主键值。
  • 解决方法:确保插入的数据在主键列上是唯一的,或者使用自增主键(AUTO_INCREMENT)来避免冲突。
代码语言:txt
复制
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL
);

问题2:唯一键冲突

  • 原因:尝试插入重复的唯一键值。
  • 解决方法:确保插入的数据在唯一键列上是唯一的,或者在插入前检查唯一性。
代码语言:txt
复制
CREATE TABLE users (
    id INT PRIMARY KEY,
    email VARCHAR(100) UNIQUE
);

问题3:如何选择主键和唯一键

  • 解决方法:根据业务需求选择。如果某个字段必须唯一且不能为空,使用主键;如果某个字段只需要唯一但允许为空,使用唯一键。

参考链接

希望这些信息对你有所帮助!如果有更多问题,请随时提问。

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

相关·内容

Mysql资料 主键

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

6.7K20
  • MySQL的主键详解

    表中的任何列都可以作为主键,只要它满足以下主键值规则条件: 任两行不具相同的主键值 每行都必须具有一个主键值(主键列不允许NULL) 这里的规则是MySQL本身强制实施的。...除MySQL强制实施的规则外,还应该坚持的最佳实践: 不更新主键列中的值 不重用主键列的值 不在主键列中使用可能会更改的值 例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其 名字时...,必须更改这个主键) 联合主键 好处 可以直观的看到某个重复字段的记录条数 主键A跟主键B组成联合主键 主键A跟主键B的数据可以完全相同,联合就在于主键A跟主键B形成的联合主键是唯一的。...联合主键体现在多个表上,复合主键体现在一个表中的多个字段。 复合主键 主键通常定义在表的一列上,但这并不是必需的,也可使用多个列作为主键。...表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键 将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样

    8.1K20

    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.7K30

    MySQL主键约束使用

    MySQL主键约束是一种用于确保表中每行数据的唯一性的限制。每个表只能有一个主键,它可以是一个或多个列。创建表时添加主键约束在创建表时添加主键约束,需要在列名后面添加关键字"PRIMARY KEY"。...在已经存在的表中添加主键约束如果已经存在一个表,但需要将某些列或字段添加主键约束,可以使用ALTER TABLE语句来修改表结构。...主键约束和自增列通常情况下,主键约束通常与自增列一起使用。自增列是指在插入新行时,自动为该行分配一个唯一的值。在MySQL中,可以使用AUTO_INCREMENT关键字来创建自增列。...这意味着在插入数据时,无需提供"id"列的值,MySQL会自动为其分配一个唯一的值。示例假设有一个用户表,其中包含以下列:id、name和email。...以下是如何插入数据的示例:INSERT INTO users (name, email)VALUES ('John', 'john@example.com');在上面的示例中,"id"列是自增列,不需要手动提值,MySQL

    5.2K20

    MySQL数据关系的基石:深入解析主键、外键与唯一键

    除了单字段主键,MySQL还支持复合主键(Composite Primary Key),即由多个字段组合而成的主键。...MySQL的UNIQUE约束,可以轻松实现唯一键的功能。...监控锁竞争 在高并发环境中,主键和唯一键可能引发锁竞争(如间隙锁)。通过MySQL的SHOW ENGINE INNODB STATUS命令可以观察锁等待情况,并及时调整事务粒度或索引设计。...越来越多的企业选择托管数据库服务,如AWS RDS、阿里云RDS或腾讯云数据库MySQL版,这些服务在底层优化了主键、外键和唯一键的处理机制,提供了更强大的可扩展性和高可用性。...MySQL也在不断进化,例如通过MySQL HeatWave支持内存计算和机器学习一体化,这些进步让主键、外键和唯一键在更复杂的数据工作负载中继续保持其核心地位。

    22.6K10

    MySQL为什么需要主键

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

    3.2K00

    Mysql:小主键,大问题

    本篇讲解 Mysql 的「主键」问题,从「为什么」的角度来了解 Mysql 主键相关的知识,并拓展到主键的生成方案问题。再也不怕被问到 Mysql 时只知道 CRUD 了。...这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录「按主键顺序存放」,因此每当有一条新的记录插入时,MySQL 会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB...否则由于每次插入主键的值近似于随机,因此每次新记录都要被插到现有索引页的中间某个位置,MySQL 不得不为了将新记录插到合适位置而「移动数据」,如下图右侧所示,这样就造成了一定的开销。...一般情况下,我们都使用 Mysql 的自增 ID,来作为表的「主键」,这样简单,而且从上面讲到的来看,性能也是最好的。...数据库的实现 Mysql 自增 Mysql 在内存中维护一个「自增计数器」,每次访问 auto-increment 计数器的时候, InnoDB 都会加上一个名为「AUTO-INC 锁」直到该语句结束(

    5.6K10

    大战MySQL主键及其操作

    简忆上次所学知识:MySQL的记录长度为65535个字节,而varchar是达不到它的理论长度的,NULL占用一个字节,text文本不占用记录长度,因为它本身就占据十个字节。...这里继续学习与MySQL列属性相关知识:关于主键的增,改,删。...主键 主键:primary key (一张表中最多只能有一个主键) 主键,简而言之为主要的键,一张表中只能有一个字段可以使用对应的键,用来约束该字段里面的数据,不能重复,被称之为主键 。...运行结果:PRI代表主键(大部分时候),NULL为no,即主键本身不为空 二.创建表的时候,在字段之后,可以使用primary key(主键字段列表)来创建(如果有多个字段作为主键,可以称之为复合主键...删除主键 因为主键无法更新:所以只能先删除,再增加。

    5.9K20

    MYSQL-主键(Primary Key)

    MySQL(本章节) PostgreSQL MongoDB Redis Etcd 主键是数据库表设计中最为重要的概念之一,它远不止是“唯一标识符”那么简单,尤其是在 MySQL 默认的 InnoDB 存储引擎中...二、主键的核心特性 唯一性 (Unique),主键值在整个表中必须是唯一的,任意两行都不能拥有相同的主键值。 非空性 (Not Null),主键字段不能为空(NULL)。...四、InnoDB 存储引擎下主键的特殊性 理解 InnoDB 的聚簇索引结构是理解主键的关键。 如果表定义了主键:InnoDB 就使用这个主键来作为聚簇索引。...不推荐/谨慎使用:UUID 缺点: 如果必须使用 UUID,可以考虑有序 UUID(如 MySQL 8.0 的 UUID_TO_BIN(... , 1))或将其作为业务键,另设一个自增 INT 作为主键...mysql> SHOW CREATE TABLE test_data; +-----------+----------------------------------------------------

    3K10

    MySQL中主键为0和主键自排约束的关系

    现在主键是没有0的,如果把某个id改成0的话,0不会变!...如果使用主键自排约束以前表里有0,再设置完主键自排以后所有的0又不会根据行数,而是直接按照自上而下的顺序从1开始排。...如果把表中的某个主键的数改成0,那直接就会进行排序放到正数前面,也就是说主键自排是允许有0存在的,那为什么本身存在的0要去修改成从1开始的递增序列呢?...哪怕没加主键自排以前只有一个0,加了主键自排以后还是会变成1。   开始有0,增加主键自排约束,0依次变为1,2,3,4.......   ...开始没0,增加主键自排约束,新添加的主键是0的行会根据行数自行变化,注意这里是新添加的行,使用的是insert。   开始没0,把某个主键的数修改成0,这个0会直接在排好序了再在表里显示出来。

    6K30

    MySQL adddrop字段时报主键冲突

    问题现象 很多DBA朋友做ddl 变更比如添加、删除字段时,一定概率上会遇到如下报错: Duplicate entry '7458421' for key 'PRIMARY' 错误提示是主键冲突,但是当我们去查询...遇到这种情况,一般有如下场景: 1 表具有一个或者多个唯一键。2 表比较大,执行DDL耗时超过数十秒。3 表的insert 操作比较频繁。...问题分析 首先我们通过一个思维导图了解一下MySQL online DDL 的过程,大家注意commit阶段,会把ddl 执行期间的记录的 log 重新应用到新的表上。 ?...从官方文档中的描述所说 online ddl 期间,其他会话执行的dml操作造成唯一键冲突的sql会记录到 online log 中,在commit阶段等变更结束之后再应用这些sql会导致报错唯一键冲突...https://bugs.mysql.com/bug.php?

    5.8K21

    【MySQL】空属性 && 默认值 && comment && 零填充 && 主键 && 唯一键 && 外键 && 自增

    主键primary key(⭐常用)primary key 用来唯一的约束该字段里面的数据,它有如下的特点:主键值不能重复,因为具有唯一性主键值不能为空一张表中最多只能有一个主键主键所在的列通常是整数类型追加和删除主键的指令如下所示...通常和主键搭配使用,作为逻辑主键。特点如下所示:任何一个字段要做自增长,前提是本身是一个索引自增长字段必须是整数一张表最多只能有一个自增长Ⅶ....唯一键unique(⭐常用)在 mysql 中,唯一键(Unique Key)是一种约束,用于确保表中的某个列或一组列的值是唯一的,防止重复数据的插入或更新。...在创建表时,可以通过在列定义中使用 unique 关键字来指定唯一键!...它和主键的唯一区别就是如果该列字段没有设置 not null 的话,那么定义为唯一键的话是可以插入 null 值的,而主键则不可以插入 null 值!Ⅷ.

    40510

    【MySQL】主键优化原理篇——【数据组织方式&主键顺序插入&主键乱序插入&页分裂&页分裂】

    前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎!...本章主要内容面向接触过C++ Linux的老铁 主要内容含: 一.主键优化 1.主键设计原则 满足业务需求的情况下, 尽量降低主键的长度。...尽量不要使用UUID做主键或者是其他自然主键,如身份证号 对于一个表。聚集索引有一个,但二级索引有很多,二级索引到叶子节点中挂的就是主键。...主键比较长,二级索引比较多,会占用许多空间,搜索时耗费更多磁盘io 业务操作时,避免对主键的修改。...主键顺序插入 第一个页满了,插入第二个页,一页16k,以此类推 【2】页分裂(主键乱序插入) 下面演示页分裂: 此时两页都满了, 我们要插入id为50的数据 ,他会开辟一个新的数据页,但并不是直接插入到第三个数据页当中

    93310

    MySQL 主键自增注意事项

    很多小伙伴应该知道,在 MySQL 中主键不应该使用随机字符串。但是主键不用随机字符串用什么?主键自增?主键自增就是最佳方案吗?有没有其他坑?今天我们就来讨论下这个话题。 1....为什么不用 UUID 经过上篇文章的介绍,我们知道在 MySQL 中,主键索引就是聚簇索引,MySQL 表中的数据是根据主键值聚集在一起的,聚簇索引是一棵 B+Tree,这棵树中的数据是有序的。...基于上面的分析,我们在 MySQL 中尽量不使用 UUID 作为主键,不用 UUID,可能会有小伙伴想到,那我使用主键自增行不行?...2.2 innodb_autoinc_lock_mode 我们可以通过控制 innodb_autoinc_lock_mode 变量的值,来控制在主键自增的时候,MySQL 锁的处理思路。...mixed:在这种模式下,MySQL 会根据具体的 SQL 语句来决定日志的形式,也就是在 statement 和 row 之间选择一种。

    3.3K10
    领券