如何在没有触发器和手动插入的情况下在 mysql 中生成/自动增量 guid?

Posted

技术标签:

【中文标题】如何在没有触发器和手动插入的情况下在 mysql 中生成/自动增量 guid?【英文标题】:How to generate/autoincrement guid on insert without triggers and manual inserts in mysql? 【发布时间】:2021-03-19 10:51:55 【问题描述】:

我正在重新访问我的数据库并注意到我有一些 INT 类型的主键。

这还不够独特,所以我想我应该有一个向导。 我来自微软 sql 背景,在 ssms 中你可以 选择类型为“uniqeidentifier”并自动增加它。

然而,在 mysql 中,我发现你必须为你想要的表创建在插入时执行的触发器 为其生成指南 ID。示例:

表:

CREATE TABLE `tbl_test` (
  `GUID` char(40) NOT NULL,
  `Name` varchar(50) NOT NULL,
  PRIMARY KEY (`GUID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

触发器:

CREATE TRIGGER `t_GUID` BEFORE INSERT ON `tbl_test`
 FOR EACH ROW begin
 SET new.GUID = uuid();

或者,您必须自己在后端插入 guid。

我不是数据库专家,但仍然记得触发器会导致性能问题。

以上是我找到的 here 并且已经 9 岁了,所以我希望有所改变?

【问题讨论】:

这还不够独特:主键在设计上是独一无二的。为什么您实际上要使用 guid 而不是自动递增的整数键? 正如我所说,它不够独特。我得到 1,2,3,4,5 等作为我的主键。这是我在从前端-后端发送请求时会使用的东西,所以我想要一些更独特的东西,这样一些不太有趣的意图就无法弄清楚 PK @CodingLittle 值 1,2,3,4,5 仍然是唯一的,您没有任何重复值(唯一的定义)。但是,您仍然可以为 UUID 添加一个新列,并在您的 INSERT INTO 查询中插入 uuid() 函数的值。 我从来没有说过它不是独一无二的我说从我的角度来看它在安全性方面不够独特。至于手动插入它是我询问是否可以在没有 tirggers 和手动插入的情况下获得生成的 guid 的问题的一部分 您将外部引用与内部密钥混淆了。 【参考方案1】:

至于stated in the documentation,您可以使用uid() 作为列默认起始版本8.0.13,所以这样的事情应该可以工作:

create table tbl_test (
    guid binary(16) default (uuid_to_bin(uuid())) not null primary key,
    name varchar(50) not null
);

这几乎是从文档中复制而来的。我手头没有足够新的 MySQL 版本来测试这个。

【讨论】:

不知道“默认”参数。会试试这个。 @CodingLittle:请确保您的版本足够新:select version() 有版本 '8.0.18' 所以不用担心。非常感谢! bin 转换是怎么回事,它只是没有 GUID 类型吗?【参考方案2】:

你可以做一个

INSERT INTO  `tbl_test` VALUES  (uuid(),'testname');

当你调用它时,这会生成一个新的 uuid。

或者你也可以使用现代的uuid v4,通过使用这些函数之一代替标准的uuid(),它比mysql中的uuid更随机

How to generate a UUIDv4 in MySQL?

8.0.13以后就可以使用了

CREATE TABLE t1 (
    uuid_field     VARCHAR(40) DEFAULT (uuid())
);

但你想要的不仅仅是独一无二的,但这里只允许内部函数,而不是用户为 uuid v4 定义的函数,因为你需要 trogger

【讨论】:

我在问是否可以不使用触发器和手动插入。以上还是手动插入。 我编辑了我的答案以包含更新版本的 mysql 感谢更新,给了我两个类似的选择 这里稍作修改...uuid 生成 40 个字符。我尝试自己编辑答案,但不被允许。 我给你改了

以上是关于如何在没有触发器和手动插入的情况下在 mysql 中生成/自动增量 guid?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有后端服务器的情况下在 24 小时后触发桌面通知?

如何在没有 ID 的情况下在 Prisma 中插入新记录?

应该打字吗?如果不是,如何在不破坏用户的情况下在 npm install 上触发类型安装?

在没有插入操作的情况下在 html 文本区域中输入引号和双引号在数据库中失败。可能吗?

如何在没有MariaDB的情况下在Debian GNU / Linux 9上安装MySQL(延伸)?

如何在没有 spring-boot 的情况下在 spring-webflux 中加载配置?