MySQL 在表无主键且表里字段都不能作为主键,如何新增有序UUID为主键

MySQL表无主键、表里字段都不能作为主键,如何新增主键


前言

MySQL表无主键、表里字段都不能作为主键,如何新增有序UUID为主键?
原本数据量很大,不想用主键自增且不想用无序的UUID 情况下,本文介绍了如何使用UUID()且使它有序的一种思路。

如果你使用的MySQL 8.0 以上版本,可以直接使用 uuid_to_bin();
本文主要介绍了 MySQL 5.x 的版本。


提示:以下是本篇文章正文内容,下面案例可供参考

一、使用步骤

-- 将 my_table 拷贝 my_table_backup 的新增一个字段;
Alter TABLE  my_table_backup ADD id varchar(50) first;

-- 如果是MySQL 8.0以上 就可以使用直接使用uuid_to_bin(),就只需要下面一步。
-- 将有无主键的表 my_table 的数据迁移到 my_table_back 
INSERT INTO my_table_backup (id,originalId,contractId,remark)
SELECT uuid() as id, originalId,contractId,remark
FROM my_table order by createTime;

-- 将UUID 修改为特定的格式;手动实现 uuid_to_bin() 函数的逻辑。
UPDATE my_table_backup AS t1
JOIN (
select 
CONCAT(
    SUBSTR(t1.id, 15, 4),
    SUBSTR(t1.id, 10, 4),
    SUBSTR(t1.id,  1, 8),
    SUBSTR(t1.id, 20, 4),
    SUBSTR(t1.id, 25) ) sortId,
t1.*  FROM my_table_backup t1
) AS subquery ON t1.id = subquery.id
SET t1.id = subquery.sortId;

-- 将新增的字段设置为主键
alter table my_table_backup add primary key(id);


总结

参考文章
MySQL中UUID介绍
https://blog.youkuaiyun.com/qq_62982856/article/details/127963602

MySQL中存储UUID的最佳实践
https://blog.youkuaiyun.com/gt9000/article/details/88240649

### SQL 插入数据时设置和使用主键的方法及注意事项 #### 主键定义与作用 主键用于唯一标识中的每一行记录。通过 `primary key` 约束可以确保字段不为空不允许重复值[^3]。 #### 创建带有主键表格 当创建一个新的时,可以通过指定某个列为 `PRIMARY KEY` 来设定该列为主键: ```sql CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(50), position VARCHAR(50) ); ``` 对于自动递增的整数型主键,在不同的数据库管理系统中有不同实现方式。例如,在 MySQL 中可使用 `AUTO_INCREMENT` 关键字;而在 Oracle 数据库中,则通常会结合序列(Sequence)对象来达到相同效果。 #### 单行插入操作 在执行单条记录插入时,如果目标已经设置了自增长属性的主键,则无需显式提供此列的具体数值: ```sql -- 假设 'id' 列具有 AUTO_INCREMENT 或类似的特性 INSERT INTO employees (name, position) VALUES ('John Doe', 'Developer'); ``` 然而,如果不希望依赖于系统的自动编号机制或者所使用的 DBMS 不支持此类功能,则必须手动为每一条新纪录指派唯一的 ID 号码: ```sql INSERT INTO employees (id, name, position) VALUES (1, 'Jane Smith', 'Manager'); ``` #### 批量插入操作 为了提高效率,有时需要一次性插入多条记录到同一个表里去。此时同样要注意遵循有关主键的规定——要么让系统自行分配新的键值,要么事先准备好一批互异的关键编码供后续应用: ```sql INSERT INTO employees (name, position) VALUES ('Alice Brown', 'Analyst'), ('Bob Green', 'Designer'); ``` #### 使用存储过程或触发器辅助管理主键 除了上述基本方法之外,还可以借助编程手段进一步简化工作流程。比如利用存储过程封装好一系列复杂的业务逻辑;又或者是依靠触发器监听特定事件的发生从而动态调整关联的数据项等等。 #### 处理特殊情况下的主键冲突 为了避免潜在的风险,在设计阶段就应该充分考虑到各种可能引起问题的因素,并采取相应措施加以防范。比如说针对那些允许用户输入的内容应当实施严格的验证规则防止非法字符混入其中干扰正常运作;再者就是定期备份重要资料以便万一遇到意外情况也能迅速恢复原状而不至于造成不可挽回的巨大损失。 #### 自动生成主键的方式及其适用场景 一些现代的关系型数据库产品提供了更为便捷的方式来生成独一无二的身份识别符。像前面提到过的那样,MySQL 支持 `useGeneratedKeys=true` 参数配合 JDBC API 实现无缝对接;而对于其他平台而言也可以考虑采用 GUID/UUID 类型作为替代方案之一[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值