MySQL中如何将主键默认值设为UUID()

1、问题

mysql中在设置主键(id)的默认值时,有一下两种情况:

  • 当 id 为 int 类型时,可以直接在创建表时设置id为 id primary key auto_increase,即默认 id 为主键自增长。
  • 当 id 为 varchar 类型时,要设置主键 id 默认值为唯一且不同字符串,这时需要使用UUID()函数,但是mysql中不支持默认值为函数,本文就是为了解决这个问题。

2、解决方案

首先,需要先创建一个表,SQL语句如下:

CREATE TABLE traveller(
 id VARCHAR(50) PRIMARY KEY,-- 要设置默认值为UUID()的主键
 NAME VARCHAR(32),
 sex VARCHAR(20),
 phoneNum VARCHAR(20),
 credentialsType INT,
 credentialsNum VARCHAR(50),
 travellerType INT
);

在创建完表之后,需要创建一个触发器,从而将主键的默认值设定为UUID()生成的字符串。
触发器的创建
在创建好的触发器中编写的代码如下:

DELIMITER $$
CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    TRIGGER `ssm`.`id_trigger` -- 触发器名称
    BEFORE INSERT             -- 触发器被触发的时机
    ON `ssm`.`traveller`       -- 触发器所作用的表名称
    FOR EACH ROW BEGIN
		SET new.id=REPLACE(UUID(),'-',''); -- 触发器执行的逻辑
    END$$

DELIMITER ;

对于触发器的编写做以下总结:

  • create trigger ssm.id_triggerssm.id_trigger为触发器名称,可任意指定。
  • 触发器被触发的时机:在使用 insert/delete/update 这三种SQL语句对于指定表进行操作之前或之后(before/after)。

在于语句中的表现: BEFORE INSERT ON ssm.traveller 即是在对ssm.traveller表进行 insert 操作之前 触发器被触发。

  • 触发器的执行逻辑:在 begin 和 end 之间的SET new.id = replace(UUID(),’-’,’’); ,即指定新的id值为: UUID()函数生成的字符串中的 ‘-’ 被替换为 ‘’ 之后的字符串。

在触发器设定好之后,对于traveller表执行以下语句:

INSERT INTO 
traveller(NAME,sex,phoneNum,credentialsType,credentialsNum,travellerType) 
VALUES('jay','男','13222222222',0,'1234567890026',0);

所得到的的结果为:
所得结果

若触发器中所写逻辑为:

SET new.id=UUID(); 

插入后的结果应为:
原始结果
从以上对比中,可以知道这两种不同逻辑的区别。

3、总结

最后要知道该问题解决后所带来的优点和缺点:

  • 优点:使用UUID()函数生成的唯一标识来作为默认id值,使得用户的 id 更加安全。
  • 缺点:UUID()函数所生成的唯一标识过长,在高并发情况下影响效率,一般在该场景下不推荐使用。
  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
MySQL官方不建议使用UUID作为主键的原因有以下几点: 1. 存储空间占用:UUID是一个128位的字符串,相比于自增的整数类型主键,它需要更多的存储空间。这在大规模的数据表会占用较多的磁盘空间,影响数据库性能。 2. 索引效率:UUID是随机生成的字符串,不具有连续性。在使用UUID作为主键时,每次插入新记录都需要在索引树找到合适的位置,这会导致索引的频繁更新和碎片化,降低了查询效率。 3. 数据库性能:由于UUID是随机生成的,插入新记录时需要生成一个唯一的UUID值。这个过程需要消耗较多的计算资源,对于高并发的数据库操作来说,会增加数据库的负载,降低性能。 4. 数据库复制和同步:如果使用UUID作为主键,那么在数据库复制和同步的过程,会增加数据传输的开销。因为UUID是随机生成的,每个节点生成的UUID值都不同,导致数据同步时需要传输更多的数据。 综上所述,MySQL官方推荐使用自增的整数类型主键(如auto_increment)而不是UUID作为主键,这样可以提高数据库的性能和效率。但是在某些特定的场景下,如分布式系统或需要跨数据库同步的情况下,使用UUID作为主键可能更合适。 #### 引用[.reference_title] - *1* [MySql为什么不推荐使用UUID主键](https://blog.csdn.net/chenwiehuang/article/details/123420278)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [MySQL如何将主键默认值设为UUID()](https://blog.csdn.net/qq_43739097/article/details/104383456)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值