使用uuid替代传统数字序列id

简介:

文章出处:http://netkiller.github.io

 

我一个又一个想法使用uuid 替代 数字数列ID

 

1. uuid 不会出现重复,可以永远使用, 36为长度会增加数据库开销(影响不大)

2. 序列id 有范围限制,如果插入失败,id仍然会+1操作,造成浪费,达到最大值后会比较麻烦

3.考虑索引开销,是否会影响性能,我不清楚。我认为对于btree 平衡树增加类a-z还有“-” 使得子树数量增加,索引应该更快。

 

也听听你的看法?

 

下面是我给出的一个例子,MySQL 没有uuid 类型我使用varchar(36) 替代, PostgreSQL 有uuid 类型,但没有uuid() 函数,需要额外安装,比较烦,没有测试。

 

uuid_test_insert 是负责插入的时候建立uuid())

uuid_test_update 是保护uuid字段不会被修改

 

使用触发器是因为,我的主键 PRIMARY KEY (`id`) 想用 UUID。  DEFAULT uuid() 不允许?

CREATE TABLE `test` (
`id` VARCHAR(50) NOT NULL DEFAULT uuid(),
`username` VARCHAR(250) NULL DEFAULT NULL,
`values` VARCHAR(250) NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB;

 

-- --------------------------------------------------------

-- 主机:                           192.168.2.1

-- 服务器版本:                        5.5.25-log - MySQL Community Server (GPL)

-- 服务器操作系统:                      Linux

-- HeidiSQL 版本:                  8.0.0.4396

-- --------------------------------------------------------

 

-- 文章出处:http://netkiller.github.io

 

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;

/*!40101 SET NAMES utf8 */;

/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

 

-- 导出  表 test.uuid_test 结构

DROP TABLE IF EXISTS `uuid_test`;

CREATE TABLE IF NOT EXISTS `uuid_test` (

  `uuid` varchar(36) NOT NULL,

  `name` varchar(20) NOT NULL,

  PRIMARY KEY (`uuid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='uuid 测试';

 

-- 数据导出被取消选择。

 

-- 文章出处:http://netkiller.github.io 

 

-- 导出  触发器 test.uuid_test_insert 结构

DROP TRIGGER IF EXISTS `uuid_test_insert`;

SET @OLDTMP_SQL_MODE=@@SQL_MODE, SQL_MODE='';

DELIMITER //

CREATE TRIGGER `uuid_test_insert` BEFORE INSERT ON `uuid_test` FOR EACH ROW BEGIN

IF new.uuid is null or new.uuid = '' or length(new.uuid) != 36 THEN  

set new.uuid=uuid();  

END IF;

END//

DELIMITER ;

SET SQL_MODE=@OLDTMP_SQL_MODE;

 

 

-- 导出  触发器 test.uuid_test_update 结构

DROP TRIGGER IF EXISTS `uuid_test_update`;

SET @OLDTMP_SQL_MODE=@@SQL_MODE, SQL_MODE='';

DELIMITER //

CREATE TRIGGER `uuid_test_update` BEFORE UPDATE ON `uuid_test` FOR EACH ROW BEGIN

set new.uuid = old.uuid;

END//

DELIMITER ;

SET SQL_MODE=@OLDTMP_SQL_MODE;

/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;

/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

目录
相关文章
|
Android开发 芯片 开发者
adb 查看安卓手机 CPU 类型(armeabi、armeabi-v7a、arm64-v8a ...)
adb 查看安卓手机 CPU 类型(armeabi、armeabi-v7a、arm64-v8a ...)
2793 0
|
12月前
|
缓存 监控 UED
升级 Vue3 时,如何减少打包体积的增加?
升级 Vue3 时,如何减少打包体积的增加?
562 59
|
6月前
|
监控 Java Go
阿里云可观测全面拥抱 OpenTelemetry 社区
阿里云可观测全面拥抱 OpenTelemetry 社区
120 1
阿里云可观测全面拥抱 OpenTelemetry 社区
|
7月前
|
传感器 人工智能 Java
你知道数字电路的基础逻辑门电路吗,来拿下
基础逻辑门电路是数字电路的核心单元,包括与门、或门、非门、与非门、或非门、异或门和同或门。每种门电路执行特定的逻辑运算,产生相应的输出信号。例如,与门仅在所有输入为高电平时输出高电平;或门只要有一个输入为高电平就输出高电平;非门则对输入信号取反。这些门电路广泛应用于计算机CPU、报警系统、数据校验和同步电路中,是构建复杂数字系统的基石。
590 0
你知道数字电路的基础逻辑门电路吗,来拿下
|
9月前
|
人工智能 自然语言处理 搜索推荐
你用过最好用的AI工具是什么?
2023年AI革命风起云涌,众多产品令人振奋。我体验了OpenAI的ChatGPT、微软New Bing、Anthropic Claude等多款AI产品。特别推荐微软New Bing,它集成了强大的搜索引擎和语言模型,回答问题精准,提供最新信息,还能免费进行创意绘图。此外,New Bing还集成了Copilot网页助手,帮助用户高效提取和总结内容。
415 27
你用过最好用的AI工具是什么?
|
存储 缓存 前端开发
毕业设计|SpringBoot+Vue的前后端分离个人博客系
毕业设计|SpringBoot+Vue的前后端分离个人博客系
262 0
|
Java Linux Maven
设置 Maven 环境变量
配置Maven环境变量涉及Windows、Linux和Mac。在Windows上,需新建系统变量`MAVEN_HOME`,值为Maven安装路径,编辑`Path`添加`%MAVEN_HOME%\bin`。在Linux中,下载解压Maven后移动到`/usr/local/`,编辑`/etc/profile`添加`MAVEN_HOME`和`PATH`。在Mac上,类似Linux操作,下载解压后移动到`/usr/local/`,编辑`/etc/profile`。最后,通过`mvn -v`检查是否安装成功。
|
并行计算 数据挖掘 数据处理
Pandas性能优化与高级功能:让数据处理更高效
【4月更文挑战第16天】本文探讨了如何优化Pandas的性能和利用其高级功能。关键的性能优化方法包括选择合适的数据类型、避免数据复制、使用向量化操作、优化查询和索引,以及探索并行计算。高级功能涉及分组聚合、窗口函数、数据透视表、缺失值处理和分类数据编码。通过这些技巧,可以更高效地处理大规模数据集。
|
机器学习/深度学习 数据采集 人工智能
ONE-PEACE:探索通往无限模态的通用表征模型
过去几年里,表征模型在自然语言处理、计算机视觉、语音处理等领域取得了巨大的成功。经过大量数据学习的表征模型,不仅可以在各种下游任务上取得良好的效果,还可以作为大规模语言模型(LLM)的基座模型,为LLM提供多模态理解能力。随着多模态技术的发展,尤其CLIP[1]之后大家都意识到一个好的多模态表征模型在很多单模态任务上都会发挥着至关重要的基础模型的作用。学习了大量模态alignment的数据之后的模型逐渐在学会去理解各个模态和模态间蕴含的知识,甚至通过对大量模态的学习促进对其它模态的理解。
22410 7
|
SQL 机器学习/深度学习 JSON
基于 Apache Flink 的实时计算数据流业务引擎在京东零售的实践和落地
京东零售-技术研发与数据中心张颖&闫莉刚在 ApacheCon Asia 2022 的分享。
基于 Apache Flink 的实时计算数据流业务引擎在京东零售的实践和落地