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

批量搜索并替换整数ID到UUID的fkey关系?

批量搜索并替换整数ID到UUID的fkey关系是一个常见的数据库迁移任务,尤其在需要增强数据安全性或满足特定业务需求时。以下是这个过程的基础概念、优势、类型、应用场景以及可能遇到的问题和解决方案。

基础概念

  • 整数ID:通常用于数据库表中的主键,是一个简单的整数。
  • UUID(Universally Unique Identifier):一个128位的标识符,旨在全球范围内唯一。
  • fkey关系:指的是数据库表之间的外键关系。

优势

  1. 唯一性:UUID几乎可以保证在全球范围内的唯一性,减少了ID冲突的风险。
  2. 安全性:UUID不像整数ID那样容易被猜测,提高了系统的安全性。
  3. 分布式系统友好:UUID适合在分布式系统中使用,因为它们不需要中心化的ID生成器。

类型

  • 版本1:基于时间和MAC地址生成。
  • 版本3和5:基于命名空间和名称的MD5或SHA-1散列。
  • 版本4:完全随机生成。

应用场景

  • 用户身份验证:使用UUID作为用户ID可以增加安全性。
  • 分布式数据库:在多个数据库实例之间同步数据时,UUID可以避免ID冲突。
  • 数据迁移:在重构数据库结构时,将旧的整数ID迁移到UUID。

可能遇到的问题和解决方案

问题1:如何批量替换整数ID到UUID?

解决方案

  1. 创建一个新的UUID字段。
  2. 更新现有记录,将整数ID转换为UUID。
  3. 更新所有外键引用。
  4. 删除旧的整数ID字段。
代码语言:txt
复制
-- 假设有一个表 `users` 和一个表 `orders`
ALTER TABLE users ADD COLUMN uuid_id CHAR(36);
UPDATE users SET uuid_id = UUID();
ALTER TABLE orders ADD COLUMN user_uuid CHAR(36);
UPDATE orders SET user_uuid = (SELECT uuid_id FROM users WHERE id = orders.user_id);
ALTER TABLE orders DROP COLUMN user_id;
ALTER TABLE users DROP COLUMN id;

问题2:如何确保UUID的唯一性?

解决方案

  • 使用版本4的UUID,它是完全随机生成的,几乎可以保证唯一性。
  • 在生成UUID时,可以使用数据库内置的函数(如PostgreSQL的uuid_generate_v4())。

问题3:性能影响

解决方案

  • 批量处理数据以减少对数据库的压力。
  • 在低峰时段进行迁移操作。
  • 使用索引优化查询性能。

示例代码

以下是一个Python示例,使用SQLAlchemy进行批量替换:

代码语言:txt
复制
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey
from sqlalchemy.orm import sessionmaker
import uuid

engine = create_engine('sqlite:///example.db')
metadata = MetaData()

users = Table('users', metadata,
    Column('id', Integer, primary_key=True),
    Column('uuid_id', String(36))
)

orders = Table('orders', metadata,
    Column('id', Integer, primary_key=True),
    Column('user_id', Integer, ForeignKey('users.id')),
    Column('user_uuid', String(36))
)

metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

# 批量更新用户表
for user in session.query(users).yield_per(100):
    user.uuid_id = str(uuid.uuid4())
session.commit()

# 批量更新订单表
for order in session.query(orders).yield_per(100):
    order.user_uuid = session.query(users).filter_by(id=order.user_id).first().uuid_id
session.commit()

# 删除旧的外键和字段
orders.c.user_id.drop()
users.c.id.drop()

通过上述步骤和示例代码,可以有效地将整数ID批量替换为UUID,并确保数据的完整性和一致性。

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

相关·内容

【TPC-C】TPC-C标准化基准测试设计RDBMS的相关表结构

测试基于具有多个终端用户并发访问数据库的场景】,测试广泛的数据库功能,包括查询、更新和 mini-batch事务(队列式小批量事务)。...事务内容:订单中每个订单行的平均数量必须在9.5到10.5的范围内,并且每个订单的订单行数量必须在5到15之间均匀分布,用于在测量间隔期间提交到系统的新订单交易【原文75页】 主要特点:中量级、读写频繁...解释: TPC-C数据库的组件被定义为由九个单独且独立的表组成。这些表之间的关系在下面显示的实体-关系图中定义,并受到第1.4条规定的规则的约束。...实体块中的数字表示表的基数(行数)。这些数字会乘以W,即仓库的数量,以说明数据库的扩展情况(参见第4条款)。 在关系箭头旁边的数字表示关系的基数(每个父项的平均子项数)。...日期组件必须能够容纳从1900年1月1日到2100年12月31日之间的任何日期。时间组件必须能够表示从00:00:00到23:59:59的时间值范围,分辨率至少为一秒。

67600

使用 Power Shell 修改 Hyper-V 虚拟机 UUID 的解决方案

的唯一性 可以使用命令 ip link 或 ifconfig -a 来获取网络接口的 MAC 地址 可以使用 sudo cat /sys/class/dmi/id/product_uuid命令对...product_uuid 校验 检查 mac 地址,因为之前就修改过IP,在Hyper-V管理器中就可以看到是不一样 接着检查 product_uuid,使用了之前安装的jumpserver批量执行了下...,皇天不负有心人,在我不停迭代搜索词后,还是让我找到了一篇看得懂行得通的博客 PowerShell修改Hyper-V虚拟机的UUID 尝试了文章引用的国外大佬的工具,发现已经无法运行,好在博主提供了一个可以直接使用的脚本...文件执行 #这里假设虚拟机的VMname是devops01,自行替换即可 $VMname="devops04" $vmx = Get-WmiObject -Namespace root\virtualization...所以看到一个大写,一个小写其实没关系 将所有虚拟机执行完一遍后,检查可以看到已经成功修改 结语 习惯了 ChatGPT 的便捷,发现 Google 的次数都变少了,关键词一开始没有找准走了一点弯路

78510
  • 一个vuepress配置问题,引发的js递归算法思考

    ": "dmQSRn6AXUBSg96x", "child_uuid": "", "parent_uuid": "", "doc_id": 141216125,...,关键字段: type:值为'DOC' 是文章、值为 TITLE 则为目录 uuid:文章 id prent_uuid:父节点的 uuid 咱们根据以上参数,编写递归函数, 将elog.cache.json...广度优先搜索,对数据结构的竖向执行,把树结构平面铺开、以层级数为列数,从第一列依次执行。 将深度搜索、广度搜索代入到生活场景更容易理解。...我们可以使用广度优先搜索来实现页面导航功能,以确保按照层级关系有序地展示页面。...在这个函数中,我们使用队列作为辅助数据结构来进行广度优先搜索。通过不断将子页面加入队列,并按照队列中的顺序处理每个页面,可以实现按照层级关系有序地导航页面。

    30120

    分布式ID生成方案

    通过ID,可以迅速定位到对象实体、为对象之间建立关联、跟踪对象在不同服务之间的流转等等。 有的ID是无意义的唯一的标识,有的ID还能提供额外的信息,比如时间和机房信息等等。...为了确保唯一性,有的ID使用很长的字节数,比如256个字节,有的通过递增的long类型,只需要8个字节来表示。考虑到存储、信息包含量、性能、安全等因素,一个好的ID的设计至关重要。...递增的整数 可以通过关系型数据库的自增主键产生唯一的ID,现在流行的商业数据库都支持自增主键的特性,比如mysql等。 一些nosql数据库也提供类似特性,比如Redis。...测试中,单个节点可以提供12万ID/秒的产生速度,而如果采用批量获取100ID的话,可以取得接近三百万ID/秒的性能。...2、如果采用批量获取,尽量减少网络消耗,256个client并发,每次只获取100个ID, ID的产生速度是 297万个ID/秒。

    77400

    如何从 MongoDB 迁移到 MySQL

    在数据的迁移过程中,我们会将原有的 _id 映射到 uuid 中,post_id 映射到 post_uuid 上,我们通过保持 uuid和 post_uuid 之间的关系保证模型之间的关系没有丢失,在迁移数据的过程中...在全部的数据都被插入到 MySQL 之后,我们通过 #find_by_uuid 查询的方式将 uuid 和 post_uuid 中的关系迁移到 id 和 post_id 中,并将与 uuid 相关的字段全部删除...数据的迁移 为每一个模型创建对应的迁移文件并建表其实一个不得不做的体力活,虽然有一些工作我们没法省略,但是我们可以考虑使用自动化的方式为所有的模型添加 uuid 字段和索引,同时也为类似 post_id...MySQL 中对应的表中,并将所有的 _id 转换成 uuid、xx_id 转换成 xx_uuid,而后者就是前面提到的:通过 uuid 和 xx_uuid 的关联重新建立模型之间的关系并在最后删除所有的...将所有的数据全部插入到 MySQL 的表之后,模型之间还没有任何显式的关系,我们还需要将通过 uuid 连接的模型转换成使用 id 的方式,对象之间的关系才能通过点语法直接访问,关系的建立其实非常简单,

    5.4K52

    Redis系列之常见数据类型应用场景

    ,返回1tst getrange tkey 0 3 key进行递增(整数) # 返回1 incr ikey # 递增指定大小的值,返回124 incrby ikey 124 key进行递增(浮点数) #...设置初始浮点数值 set fkey 1.2 # 在原来基础上递增2.4,返回3.6 incryfloat fkey 2.4 加上key过期时间 expire tkey 10 分布式锁实现,set if...group=string 应用场景 对于Redis String类型的应用场景也比较多,比如很常有的做缓存处理,也可以用于分布式锁、分布式ID 分布式锁的实现主要依赖于命令setnx 分布式ID...hash的field 存储一些统计类的数据,比如访问量、点击量等等 如图,如果要统计博客的pv、uv还有评论数量(evaluation_count),随着博客数量的增加存储到数据库里,后面肯定会查询比较慢...sinter skey skey1 获取集合的并集 sunion skey skey1 Set的更多命令请参考:https://redis.io/commands/?

    24030

    基于Spark的ID Mapping——Spark实现离线不相交集计算

    最近在开发一个ID Mapping业务系统——识别数据上报中社交账号的关联关系,找到系统中哪些社交账号属于现实世界中的同一个人。...当然实际的ID Mapping可能有更复杂的关联关系,并不是两个社交账号在同一条上报数据中出现这么简单的逻辑,这就不在本文讨论的范围内了。...举例来说,给定A-B、B-C两组社交账号的关联关系,A、B、C应该全部关联在一个UUID下,此时若B点被删除,或B-C关联关系解除,系统无法将A和C解除关联。...既然很难处理动态变化的图,就每天批量计算一下某一时刻所有账号的关联关系吧。本文就是要介绍一下如何用Spark的RDD API实现静态图不相交集的计算。...将每一行中的 替换为集合中最小的节点ID 最后一步就是算法的核心,通过自关联,将所有叶子节点关联到根节点上。

    4.2K145

    6 种常见分布式唯一ID生成策略及它们的优缺点对比

    来生成 方法二:单点批量ID生成服务 方法三:uuid / guid 方法四:取当前毫秒数 方法五:使用 Redis 来生成 id 方法六:Twitter 开源的 Snowflake 算法 ?...---- 全局唯一的 ID 几乎是所有系统都会遇到的刚需。这个 id 在搜索, 存储数据, 加快检索速度 等等很多方面都有着重要的意义。...方法三:uuid / guid 不管是通过数据库,还是通过服务来生成ID,业务方Application都需要进行一次远程调用,比较耗时。uuid是一种常见的本地生成ID的方法。...,作为主键建立索引查询效率低,常见优化方案为“转化为两个uint64整数存储”或者“折半存储”(折半后不能保证唯一性) 方法四:取当前毫秒数 uuid是一个本地算法,生成性能高,但无法保证趋势递增,且作为字符串...优点: 本地生成ID,不需要进行远程调用,时延低 生成的ID趋势递增 生成的ID是整数,建立索引后查询效率高 缺点: 如果并发量超过1000,会生成重复的ID 这个缺点要了命了,不能保证ID的唯一性。

    2.2K61

    SQL命令 CREATE TABLE(五)

    如果外键字段引用单个字段,则这两个字段必须具有相同的数据类型和字段数据约束。 在父/子关系中,没有定义的子项顺序。应用程序代码不得依赖于任何特定顺序。...如果是,则更新会导致引用要更新的行的外键字段将更新级联到所有引用行。 表定义不应该有两个不同名称的外键,这两个外键引用相同的标识符-公共字段并执行相互矛盾的引用操作。...分片表和外键 外键支持分片和未分片表的任意组合,包括:键表分片、fkey表未分片;key表未分片、fkey表分片;同时支持key表和fkey表分片。被引用表中的键可以是碎片键,也可以是另一个键。...但是,可以将隐式外键投影到ODBC/JDBC和管理门户。所有字段引用都作为外键投影到ODBC/JDBC,如下所示: 这些隐式外键被报告为无操作的UPDATE和DELETE引用操作。...此分片键字段必须采用整数值;它应该与系统分配的协分片表的RowID值相匹配。例如,SHARD KEY (deptnum) COSHARD WITH department。

    1.8K50

    Spring Boot 集成 Elasticsearch 实战

    ,同时为它添加 @Bean(destroyMethod = "close") 注解,当 destroy 的时候做一个关闭,这个方法主要是如何初始化并创建一个 RestHighLevelClient。...在这里演示下创建文档、批量创建文档、查看文档、更新文档以及删除文档: 创建文档 创建文档的时候需要在 IndexRequest 中指定索引名称,id 如果不传的话会由 ES 自动生成,然后传入 source...批量创建文档 在一个 REST 请求中,重新建立网络开销是十分损耗性能的,因此 ES 提供 Bulk API,支持在一次 API 调用中,对不同的索引进行操作,从而减少网络传输开销,提升写入速率。...,接下来对搜索进行简单介绍: 搜索操作 对 ES 的 DSL 语法还不是很熟悉的可以先看下这篇文章:看完这篇还不会 Elasticsearch 搜索,那我就哭了!...最好的关系就是互相成就,大家的点赞、在看、分享、留言就是我创作的最大动力。

    1.3K30

    讲分布式唯一id,这篇文章很实在

    分布式唯一ID介绍 分布式系统全局唯一的 id 是所有系统都会遇到的场景,往往会被用在搜索,存储方面,用于作为唯一的标识或者排序,比如全局唯一的订单号,优惠券的券码等,如果出现两个相同的订单号,对于用户无疑将是一个巨大的...大致有序或者单调递增:自增的特性有利于搜索,排序,或者范围查询等 高性能:生成ID响应要快,延迟低 高可用:要是只能单机,挂了,全公司依赖全局唯一ID的服务,全部都不可用了,所以生成ID的服务必须高可用...优点: 基于内存,速度快 天然排序,自增,有利于排序搜索 缺点: 步长确定之后,增加机器也比较难调整 需要关注持久化,可用性等,增加系统复杂度 redis持久化如果是RDB,一段时间打一个快照,那么可能会有数据没来得及被持久化到磁盘...文档里面讲得很清晰,一共有两个版本: V1:预分发的方式提供ID,也就是前面说的号段式分发,表设计也差不多,意思就是批量的拉取id [image-20211012002835752] 这样做的缺点就是更新号段的时候...不使用,二进制中最高位是为1都是负数,但是要生成的唯一ID都是正整数,所以这个1位固定为0。

    53100

    讲分布式唯一id,这篇文章很实在

    介绍 分布式系统全局唯一的 id 是所有系统都会遇到的场景,往往会被用在搜索,存储方面,用于作为唯一的标识或者排序,比如全局唯一的订单号,优惠券的券码等,如果出现两个相同的订单号,对于用户无疑将是一个巨大的...大致有序或者单调递增:自增的特性有利于搜索,排序,或者范围查询等 高性能:生成ID响应要快,延迟低 高可用:要是只能单机,挂了,全公司依赖全局唯一ID的服务,全部都不可用了,所以生成ID的服务必须高可用...优点: 基于内存,速度快 天然排序,自增,有利于排序搜索 缺点: 步长确定之后,增加机器也比较难调整 需要关注持久化,可用性等,增加系统复杂度 redis持久化如果是RDB,一段时间打一个快照,那么可能会有数据没来得及被持久化到磁盘...文档里面讲得很清晰,一共有两个版本: V1:预分发的方式提供ID,也就是前面说的号段式分发,表设计也差不多,意思就是批量的拉取id image-20211012002835752 这样做的缺点就是更新号段的时候...不使用,二进制中最高位是为1都是负数,但是要生成的唯一ID都是正整数,所以这个1位固定为0。

    45430

    使用管理门户SQL接口(二)

    如果所选项目是表或过程,则Catalog Details类名信息提供到相应类参考文档的链接。 请注意,筛选器设置是用户自定义的,并保留以供该用户将来使用。...管理门户将一个超出可用范围的值修正为一个有效值:0修正为100; 一个小数四舍五入到下一个更大的整数; 大于10,000的数字更正为10,000。...字段的约束名称值是具有语法tableName_ctype#的生成值,其中ctype是唯一的,pkey或fkey,#是在表定义中指定的顺序分配给未命名约束的顺序整数。...约束名称值是具有语法tableNamectype#的生成值,其中ctype是唯一的,pkey或fkey,##是在表定义中指定的顺序分配给未命名约束的顺序整数。...通过将类型标识符( ‘func’, ‘meth’, ‘proc’, or ‘query’)预定到类名(例如,SQL函数MyProc变为FuncMyProc)并删除标点符号字符,如标识符和类实体名称中所述

    5.2K10

    浅谈几种常见的分布式ID

    例如,使用夏令时; 第五组值是一个IEE 802的节点标识值,它是空间上唯一的。若后者不可用,则用一个随机数字替换。...❖ 缺点 除了优势之外,UUID值也存在一些缺点: 存储UUID值(16字节)比整数(4字节)或甚至大整数(8字节)占用更多的存储空间。...内置函数支持 在MySQL中,可以以紧凑格式(BINARY)存储UUID值,并通过以下功能显示人机可读格式(VARCHAR):UUID_TO_BIN、BIN_TO_UUID、IS_UUID。...与 UUID 不同,NanoID 的大小要小 4.5 倍,并且没有任何依赖关系。此外,大小限制已用于将大小从另外 35% 减小。大小减少直接影响数据的大小。...❖ 原理 Snowflake 雪花算法,由Twitter提出并开源,可在分布式环境下用于生成唯一ID的算法。该算法生成的是一个64位的ID。

    1.5K20

    Elasticsearch 7.x:3、文档管理

    幸运的是ElasticSearch提供了文档的批量操作机制。...GET blog/_doc/_mget { "ids" : ["1", "2","3"] } id为1的文档已经删除,所以没有搜索到 { "docs" : [ { "_...每个分片执行这个搜索查询并返回结果。 结果在通道节点上合并、排序并返回给用户。...比如,把某一特定类型的书籍存储到特定的分片上去,这样在搜索这一类书籍的时候就可以避免搜索其它的分片,也就避免了多个分片搜索结果的合并。...在操作发生后立即刷新相关的主分片和副本分片(而不是整个索引),以便更新的文档立即显示在搜索结果中。只有在从索引和搜索角度进行仔细考虑并验证它不会导致性能不佳之后,才能进行此操作。

    2K51

    全局唯一ID发号器的几个思路

    ID生成服务假设每次批量拉取6个ID,服务访问数据库,将当前ID的最大值修改为5,这样应用访问ID生成服务索要ID,ID生成服务不需要每次访问数据库,就能依次派发0,1,2,3,4,5这些ID了。...,作为主键建立索引查询效率低,常见优化方案为“转化为两个uint64整数存储”或者“折半存储”(折半后不能保证唯一性) 方法四:取当前毫秒数 uuid是一个本地算法,生成性能高,但无法保证趋势递增,且作为字符串...取当前毫秒数是一种常见方案: uint64 ID = GenTimeMS(); 优点: 本地生成ID,不需要进行远程调用,时延低 生成的ID趋势递增 生成的ID是整数,建立索引后查询效率高 缺点: 如果并发量超过...思路三:划分命名空间并行生成 似乎对于分布式的ID生成,以Twitter Snowflake为代表的, Flake 系列算法,经常可以被搜索引擎找到,但似乎MongoDB的ObjectId算法,更早地采用了这种思路...不过,根据其RoadMap的描述,这个项目并没100%完成。例如,批量的ID生成,HTTP 接口,客户端Library都列在里面待实现。

    92020

    OptaPlanner实用技术 - 批量规划和实时规划(1)

    因此,只能对具体使用OptaPlanner的开发人员有一定帮助,对于相关的业务分析和决策人员关注的适用场景,该文并未作深入描述;因而,未能从业务场景到工程实践的角度和过程,来描述批量规划与实时规划的实用意义...值作为规划数据集的ID,也可以替换成Long, Sting等,但所提交给SolverManger的各个problem,其ID不可重复。...UUID problemId = UUID.randomUUID(); // 将待规划数据集(problem)提交给SolverManger,并开始规划。...image.png 实时规划 实时规划则与具体的规划业务关系更强。根据业务具体要求来决定是否需要实时规划。...(例如将该路线修改为不可用,或延长途经时间),引擎将该变更纳入考虑后,输出一个新的行驶方案,并更新司机的手机上。

    1.5K30

    mysql java uuid_Java生成UUID 与 MySQL数据库如何生成uuid数据

    在这样的情况下,就不需考虑数据库建立时的名称重复问题。 UUID 来作为数据库数据表主键是非常不错的选择,保证每次生成的UUID 是唯一的。 UUID的唯一缺陷在于生成的结果串会比较长。...去掉“-”符号 return uuid.replaceAll(“-“, “”); } 二、MySQL数据库如何批量插入不重复uuid数据 第一步:先把需要查询的数据列出来select UUID(), a.Code..., a.Name,a.Continent from 表名1 a, 表名2 b where a.Code =b.CountryCode; 注意:UUID()不要分割,分割后,uuid相同 第二步:把数据插入到表中...where a.Code =b.CountryCode ); 第三步:更新UUID,将“-”替换掉 update TEMPTABLEset id =select REPLACE(id,’-‘,”) 三、...生成UUID /*只能生成一条*/SELECT REPLACE(UUID(),’-‘,”) AS id;/*在数据库中找一张数据多的表执行生成多条*/SELECT (REPLACE(UUID(),’-‘

    4.7K30
    领券