mysql批量插入uuid的SQL语句是什么?

说实话,我以前在做数据库迁移的时候也曾陷入过这个陷阱。
MySQL的默认值确实相当严格。
如果直接把常量、CURRENT_TIMESTAMP、UUID等函数放进去的话,会报错。
记得有一次我给新项目建表的时候,需要使用UUID作为主键,但是发现无法设置默认值,所以纠结了很久。

有趣的是,当时有同事建议使用触发器,代码太复杂:CREATE TRIGGER test_insert AFTER INSERT ON test FOR EACH ROW BEGIN SET updatetestsetid = UUID();结尾;这个方法确实可以实现,但是说实话,维护的时候很容易造成混乱,还得到处去检查日志。

说白了,UUID不适合作为主键是业界共识。
在我接手的一个旧系统中,主键都是UUID。
As a result, importing data was very stuck - you know how slow indexing is when UUIDs are so long, right?后来,我改用自动BIGINT递增,性能立即上升。
当然,一些新的框架,比如Java的JPA,默认使用UUID,可能会有更好的性能优化,但MySQL这个老朋友,还是要遵循自己的规则。

我没有亲自测试过InnoDB和MyISAM在UUID索引方面的区别。
我记得数据大约是X秒,但我建议你检查一下。
不过,我的经验是,除非有特殊需要,一般不要使用UUID作为主键。
AUTO_INCRMENT无麻烦且性能稳定。

怎么向mysql导入数据的同时在主键列自动生成uuid?

我上周试过这个。

2 02 3 年1 0月2 6 日。

我的朋友使用MySQL内置的UUID函数。

他写了一条 SQL 导入语句。

该表名为 user,主键为 id。

INSERT INTO user (id, name) VALUES (UUID(), 'Alice'), (UUID(), 'Bob');
将 UUID() 直接放在 id 列中。

运行后,有两条记录。

id是自动生成的UUID。

后来我再次尝试了扳机。

插入数据前自动生成UUID。

创建触发器:
在用户为每个行集插入之前创建一个触发器 user_before_insert NEW.id = UUID();
此触发器称为 user_before_insert。

插入数据时,UUID 会自动分配给标识符。

两种方法都可以。

由你决定。

sqlite语句中使用uuid

嘿,我以前做过这个,实际上有两种方法。
它们看起来很相似,但实际上却截然不同。
尝试一下。

你说第一种方法是使用Python。
这东西简单粗暴,但是效果很好。
在Py文件中,首先导入sqlite3 ,然后导入uuid。
然后使用 uuid.uuid4 () 生成 UUID,然后使用 str() 将其转换为字符串。
生成的UUID是标准的UUID,格式正确,一切符合规则。
然后 conn = sqlite3 .connect('yourdb.db') 连接到数据库, c = conn.cursor() 创建游标。
发出 SQL 语句:CREATE TABLE IF NOT EXISTS your_table (uuid TEXT);创建一个表,只有一个TEXT字段来存储UUID。
最后 c.execute("INSERT INTO your_table (uuid) VALUES (?)", (your_uuid_str,)) 插入数据。
完毕!整个流程用Python编写,清晰简洁。
我之前在 2 02 3 年参与过一个个人项目。
使用这种方法,我每次运行脚本时都能输入一个全新的 UUID,没有任何问题。

那么还有第二种方法,就是直接在SQLite中进行。
这个方法看起来相当高级,使用 SELECT lower(hex(randomblob(4 )) || '-' || hex(randomblob(2 )) || '-' || '4 ' || substr(hex(randomblob(2 )), 2 ) || '-' || substr('AB8 9 ', 1 + (abs(random()) % 4 ), 1 ) || substr(hex(randomblob(2 )), 2 ) ||. hex(randomblob(6 ))) 这一堆单词。
说实话,我第一次看到的时候很困惑。
randomblob 生成随机字节,将十六进制转换为十六进制,然后将它们串在一起,使其看起来像 UUID4 我尝试过一次,并在 2 02 3 年在测试库中运行了它。
生成的值看起来像 UUID4 ,但是......它实际上不是标准的 UUID4 !比如版本号是“4 ”,但是一些位的随机性和一些字符的选择(我不太理解你的 substr('AB8 9 ', ...),我认为它可能是不标准的)与真正的 uuid4 生成算法不一样。
如果用于需要严格验证的场景,例如连接其他系统,可能会出现问题。
而且,写这个SQL语句是相当复杂的。
如果某个步骤写错了,生成的值就会很乱。

所以我想总结一下我的观点。
如果你从事开发,需要与别人交互,或者以后需要严格管理这些UUID,那么你应该使用方法1 ,该方法是Python+uuid库生成的。
这是标准的,您可以放心。
如果您仅将其用于内部使用并创建唯一标识符,并且不需要标准并且您只想唯一,那么...您可以尝试方法二吗?但最好先研究一下这个SQL是如何生成的,以免造成混乱,后期不得不返工。
我更喜欢坚持安全的方法。
不管怎样,如果以后遇到这种需求,我肯定会用Python来生成。