首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql生成主键的函数

基础概念

MySQL中的主键(Primary Key)是用于唯一标识表中每一行记录的一个或多个列。主键必须满足以下条件:

  1. 唯一性:主键的值在表中必须是唯一的。
  2. 非空性:主键的值不能为空。
  3. 单一性:主键通常由单个列组成,但也可以由多个列组成复合主键。

生成主键的函数

MySQL提供了多种生成主键的方法,主要包括以下几种:

  1. AUTO_INCREMENT:这是最常见的方法,适用于单个整数列。
  2. UUID():生成全局唯一标识符(Universally Unique Identifier)。
  3. 序列(Sequence):虽然MySQL本身不直接支持序列,但可以通过其他方式实现类似功能。

优势

  • 唯一性:确保每条记录的唯一性,便于数据的检索和管理。
  • 性能:主键通常会被索引,可以提高查询效率。
  • 数据完整性:通过主键约束,可以保证数据的完整性和一致性。

类型

  1. 单列主键:使用单个列作为主键。
  2. 复合主键:使用多个列作为主键。

应用场景

  • 用户表:每个用户都有一个唯一的用户ID。
  • 订单表:每个订单都有一个唯一的订单号。
  • 产品表:每个产品都有一个唯一的产品ID。

示例代码

使用AUTO_INCREMENT生成主键

代码语言:txt
复制
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE
);

使用UUID()生成主键

代码语言:txt
复制
CREATE TABLE users (
    id CHAR(36) PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO users (id, name, email) VALUES (UUID(), 'John Doe', 'john.doe@example.com');

常见问题及解决方法

问题:AUTO_INCREMENT主键重复

原因:通常是由于删除记录后,AUTO_INCREMENT的值没有重置,导致新插入的记录ID重复。

解决方法

代码语言:txt
复制
ALTER TABLE users AUTO_INCREMENT = 1;

问题:UUID()主键过长

原因:UUID()生成的字符串较长,占用存储空间较大。

解决方法

  • 使用更短的唯一标识符生成方法,如自增整数。
  • 如果必须使用UUID,可以考虑存储其哈希值。

问题:复合主键查询效率低

原因:复合主键会导致索引较大,查询效率降低。

解决方法

  • 尽量减少复合主键的列数。
  • 使用覆盖索引(Covering Index)提高查询效率。

参考链接

  • [MySQL AUTO_INCREMENT](https://dev.mysql.com/doc/refman/8.0/en/numeric-type attributes.html#auto_increment)
  • MySQL UUID()

希望这些信息对你有所帮助!如果有更多问题,欢迎继续提问。

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

相关·内容

基于Saas主键生成主键id

1.主键生成策略方式 ? 主键生成策略 2.基于Saas主键生成主键id流程 由于我们系统时基于Saas,因此生成主键时,需要以租户id(TenantId)为基础进行生成。...为了生成id符合我们租户要求,通常都会现将租户表建好,然后基于租户表中租户id进行主键id生成。此时便产生基于租户id生成主键,那么怎样生成主键id呢?可以查看下图: ?...基于多租户生成方式 3.主键id生成实现具体方式 首先需要对当前id进行拦截操作,也即使用aop切面Aspect对切点进行拦截,在进行新增时候进行拦截: @Pointcut("execution...(* com.xtt..*.dao.mapper..*.insert*(..))") public void primaryKeyRule() {} 也就是说在进行主键生成时,我们拦截好需要生成主键...return current; } 从而实现主键自增目的,从而实现基于租户id进行自增策略。

1.8K20

MySQL主键详解

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

4.9K20
  • mysql 联合主键_Mysql 创建联合主键

    Mysql 创建联合主键 2008年01月11日 星期五 下午 5:21 使用primary key (fieldlist) 比如: create table mytable ( aa int, bb...char(8), cc date, primary key (aa,bb ) ); aa,bb为联合主键 不知道是不是因为mysql(6.0)版本问题,还是各版本都是这种情况,mysql中创建联合主键...TABLE t1( id … MySQL创建双主键 如下: CREATE TABLE `loginlog` ( `id` ) unsigned zerofill NOT NULL AUTO_INCREMENT...COMMENT ‘主键编号’, `IP` … mysql修改联合主键 参考 https://blog.csdn.net/BockSong/article/details/80933477 alter...涉及知识点总结如下: One to One 映射关系 一对一单向外键(XML/Annotation) 一对一双向外键关联(XML/A … SQL Server中联合主键、聚集索引、非聚集索引、mysql

    8.3K20

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

    MySQL 5.7 及之前版本,自增主键最大值会在启动(重启)后从数据库中取出放到内存: SELECT MAX(ai_col) FROM table_name FOR UPDATE; 这样获取是通过计算...从 MySQL 8.0 开始,自增主键最大值会在每次修改后写入到 redo log,并且在每个检查点写入引擎私有的系统表。 如果是正常重启,则读取系统表里值。...批量插入中一部分 ID 是指定(非 0 且非 NULL),另一部分未指定,使用数据库生成自增 ID。...其他 如果主动指定 ID 为 0 或者 NULL 插入,则会使用数据库生成自增 ID。...参考文档 为什么 MySQL 自增主键不单调也不连续 https://database.51cto.com/art/202004/614923.htm 《MySQL技术内幕——InnoDB存储引擎》

    10.8K10

    Mysql资料 主键

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

    3.8K20

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

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

    9.5K50

    .NET生成MongoDB中主键ObjectId

    前言   因为很多场景下我们需要在创建MongoDB数据时候提前生成主键为了返回或者通过主键查询创建业务,像EF中我们可以生成Guid来,本来想着要不要实现一套MongoDB中ObjectId,...结果发现网上各种各样实现都有,不过好在阅读C#MongoDB驱动mongo-csharp-driver代码时候发现有ObjectId.GenerateNewId()方法提供,我们可以直接调用即可,...在设计之初就是用作分布式数据库,所以使用ObjectId可以避免不同数据库中_id重复(如果使用自增方式在分布式系统中就会出现重复_id值)。...时间戳 机器码 进程ID 随机数 MongoDB.Driver驱动安装 1、直接命令自动安装 Install-Package MongoDB.Driver 2、搜索Nuget手动安装 调用生成主键...= ObjectId.GenerateNewId(); //输出:641c54b2e674000035001dc2 mongo-csharp-driver ObjectId详解 关于ObjectId生成原理大家阅读如下源码即可

    1.4K20

    MySQL主键设计盘点

    最近在项目中用了UUID方式生成主键,一开始只是想把这种UUID方式生成主键记录下来,在查阅资料过程中,又有了一些新认识和思考。 主键定义 唯一标识表中每行一个列(或一组列)称为主键。...主键设计和应用原则 除了满足MySQL强制实施规则(主键不可重复;一行中主键不可为空)之外,主键设计和应用应当还遵守以下公认原则: 不更新主键列中值; 不重用主键值; 不在主键列中使用可能会更改值...关于MySQL 使用自增ID主键和UUID 作为主键性能比较可以查看参考【8】。 结论: 1、uuid做主键适用于小规模分布式架构用。...结论: 用自建id生成器做主键适用于大规模分布式架构 参考: 【1】:红心李 :MySQL主键设计 【2】:Uncle Nucky :MySQL数据库主键设计原则 【3】:ellis:设计套路:Mysql...主键选取 【4】:路人甲Java:分布式系统生成唯一id常见方案 【5】:《MySQL必知必会》 【6】:美团技术团队:Leaf——美团点评分布式ID生成系统 【7】:UUID performance

    4.2K30

    JPA主键生成策略介绍

    它提供主键生成策略规范,可以与 Id 注解一起应用于实体或映射超类主键属性或字段;它只支持简单主键,派生主键不支持使用 。...2.1 主键生成策略【strategy】持久化提供程序必须使用主键生成策略来生成被注解实体主键。...pkColumnValue :【可选】ID生成器表中主键值模板,用于将该生成值集与其他可能存储在表中值区分开;默认为持久化提供程序选择值,用以存储在生成器表主键列中。...String pkColumnValue() :可选项,在生成器表中区分此生成值集合与可能存储在表中其他值集合主键值。默认为提供程序选择值,以存储在生成器表主键列中。...3.3 GenerationType.IDENTITYIDENTITY 指示持久化提供程序必须使用数据库标识列为实体分配主键。该策略只适用于支持 主键自增长 数据库系统,比如 MySQL

    18011

    主键生成策略解读(@TableId)

    基本介绍主键作用是唯一标识,我们可以通过这个唯一标识来定位到这条数据。在数据库表数据中,主键生成可以遵循自定义规则,但手动生成通常比较繁琐。...因此,在实际开发中,我们更倾向于使用框架提供主键生成策略来自动生成主键。在MybatisPlus中,提供了@TableId注解来指定主键生成策略。这个注解允许我们为新增数据指定主键生成方式。...) }ASSIGN_UUID策略示例ASSIGN_UUID策略使用UUID算法生成主键,适用于需要全局唯一字符串ID场景。...自定义主键生成策略如果你需要实现自定义主键生成策略,可以实现 com.baomidou.mybatisplus.extension.incrementer.IdentifierGenerator 接口...其他字段 // 还需要在Mybatis-Plus配置中注册你自定义主键生成器 // 例如,在Spring Boot应用中,你可以在MybatisPlusConfig类中注册

    93521

    MySQL主键约束使用

    MySQL主键约束是一种用于确保表中每行数据唯一性限制。每个表只能有一个主键,它可以是一个或多个列。创建表时添加主键约束在创建表时添加主键约束,需要在列名后面添加关键字"PRIMARY KEY"。...需要注意是,在修改表结构时,必须将该列中已经存在值都设置为唯一,否则会出现错误。主键约束和自增列通常情况下,主键约束通常与自增列一起使用。自增列是指在插入新行时,自动为该行分配一个唯一值。...在MySQL中,可以使用AUTO_INCREMENT关键字来创建自增列。...这意味着在插入数据时,无需提供"id"列值,MySQL会自动为其分配一个唯一值。示例假设有一个用户表,其中包含以下列:id、name和email。...,MySQL会自动为其分配一个唯一值。

    2.6K20

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

    开始不设置主键设计如下: 如果id位置有好几个0的话:设置主键并且自动排序时,0会从1开始递增; Insert 进去 id = 0数据,数据会从实际行数开始增加,和从0变化不一样;...现在主键是没有0,如果把某个id改成0的话,0不会变!...如果把表中某个主键数改成0,那直接就会进行排序放到正数前面,也就是说主键自排是允许有0存在,那为什么本身存在0要去修改成从1开始递增序列呢?...开始没0,增加主键自排约束,新添加主键是0行会根据行数自行变化,注意这里是新添加行,使用是insert。   开始没0,把某个主键数修改成0,这个0会直接在排好序了再在表里显示出来。...说得简单一点就是,增加主键自排约束后:    主键值:修改成0,可以存在,就是排个序。         新添加0,不允许存在,要根据行号改变。

    4.3K30

    Mysql:小主键,大问题

    本篇讲解 Mysql 主键」问题,从「为什么」角度来了解 Mysql 主键相关知识,并拓展到主键生成方案问题。再也不怕被问到 Mysql 时只知道 CRUD 了。...这就要求同一个叶子节点内(大小为一个内存页或磁盘页)各条数据记录「按主键顺序存放」,因此每当有一条新记录插入时,MySQL 会根据其主键将其插入适当节点和位置,如果页面达到装载因子(InnoDB...否则由于每次插入主键值近似于随机,因此每次新记录都要被插到现有索引页中间某个位置,MySQL 不得不为了将新记录插到合适位置而「移动数据」,如下图右侧所示,这样就造成了一定开销。...一般情况下,我们都使用 Mysql 自增 ID,来作为表主键」,这样简单,而且从上面讲到来看,性能也是最好。...在分布式情况下,其实可以独立一个服务和数据库来做 id 生成,依旧依赖 Mysql 表 id 自增能力来为第三方服务统一生成 id。为性能考虑可以不同业务使用不同表。

    3.8K10

    大战MySQL主键及其操作

    简忆上次所学知识:MySQL记录长度为65535个字节,而varchar是达不到它理论长度,NULL占用一个字节,text文本不占用记录长度,因为它本身就占据十个字节。...这里继续学习与MySQL列属性相关知识:关于主键增,改,删。...主键 主键:primary key (一张表中最多只能有一个主键主键,简而言之为主要键,一张表中只能有一个字段可以使用对应键,用来约束该字段里面的数据,不能重复,被称之为主键 。...运行结果:PRI代表主键(大部分时候),NULL为no,即主键本身不为空 二.创建表时候,在字段之后,可以使用primary key(主键字段列表)来创建(如果有多个字段作为主键,可以称之为复合主键...主键约束(修改数据) 主键对应字段中数据不允许重复:一旦重复,数据操作就会失败(增和改) 相关语句: -- 向表中插入数据 insert into my_pril values ('小明','itcast0001

    4.4K20
    领券