有没有办法在MySql中创建一个表,它有一个自动ID字段,但ID不是顺序的。例如,一个随机或伪随机ID。 我找到了解决方案,建议生成一个ID并尝试插入它,直到找到一个未使用的ID(generating an sequential five digit alphanumerical ID)。但是没有什么可以直接在表格定义中完成,或者是一个更简单的技巧。MySql表与非顺序ID
回答
MySQL有一个本地函数UUID()
,这将产生一个全局唯一标识符:
mysql> SELECT UUID();
-> '6ccd780c-baba-1026-9564-0040f4311e29'
可以输出存储在CHAR(36)
列。
INSERT INTO table (`uuid`, `col1`, `col2`) VALUES (UUID(), 'someval', 'someval');
根据尽管文档,
虽然UUID()值打算是独一无二的,它们不一定是难以猜测的或不可预测的。如果需要不可预测性,则应以其他方式生成UUID值。
补遗另一种选择是UUID_SHORT()
为64位unsigned INT
而不是字符字段。
mysql> SELECT UUID_SHORT();
-> 92395783831158784
组合键是否工作?常规的标准auto_increment字段。您插入新记录,检索其新ID,然后使用salt对该ID进行散列,然后使用该散列值更新记录。
如果您在事务中执行此操作,那么在生成哈希之前,没有哈希的记录的进行中版本将永远不可见。假设你已经完成了适当的腌制,所得到的散列值将用于所有意图和目的“随机”。
请注意,您不能在一个步骤中完成此操作,因为mysql中last_insert_id()的值不会使用新ID更新,直到记录实际写入。在实际的插入分析阶段检索到的值将是在此之前插入的任何id。
允许的表定义中唯一自动生成的默认值是自动增量(MySQL Guide)。
您应该可以通过write a trigger自动执行此过程,但可能通过迈克尔建议的UUID功能。
既然你问了一招,你可以使用一个共同的auto_incremented ID和“假”与大素乘以(然后模2^32):
CREATE TABLE AutoIncPrime
(id int unsigned auto_increment primary key
) ;
插入值,从1至10:
INSERT INTO AutoIncPrime
VALUES(),(),(),(),(),(),(),(),(),() ;
SELECT * FROM AutoIncPrime ;
输出:
id
---
1
2
3
4
5
6
7
8
9
10
假的id
,用一种观点:
CREATE VIEW AutoIncPrime_v AS
SELECT
((id*1798672429) & 0xFFFFFFFF)
AS FakeUUID
FROM AutoIncPrime ;
让我们来看看我们的“的UUID”:
SELECT * FROM AutoIncPrime_v ;
输出:
FakeUUID
----------
1798672429
3597344858
1101049991
2899722420
403427553
2202099982
4000772411
1504477544
3303149973
806855106
你甚至可以让它看起来更加随意与(更复杂一点的混合) :
CREATE VIEW AutoIncPrime_v2 AS
SELECT
( (((id*1798672429) & 0x55555555) << 1)
| (((id*1798672429) & 0xAAAAAAAA) >> 1)
)
AS FakeUUID
FROM AutoIncPrime ;
SELECT * FROM AutoIncPrime_v2 ;
FakeUUID
----------
2537185310
3918991525
2186309707
1558806648
604496082
1132630541
3719950903
2791064212
3369149034
808145601
诀窍是你在表格中仍然有一个顺序标识 - 你可以用它来连接到其他表格。你只是不显示给用户 - 但只显示假的。
如果表是让大和计算速度慢,你可以在表中添加另一列,并用一个INSERT触发器有存储FakeUUID值。
太棒了!我已经考虑过这种方法,但是最糟糕的功能(更复杂,而不是mysql),所以你给我一个指针。但)我无法看到真实的ID(反向方式没有与触发插入它就像你说的),你可以请张贴的这个可爱的功能相反?和b)生成的ID的唯一性如何(当然,在给定的范围内)?我不能确定这个功能的范围是什么,与选定的掩码和素数有关。真的感谢,并请原谅我的英语 –
我会尽量今晚写反向功能。唯一性是有保证的,如果你使用素数,比如'1798672429' :) –
- 1. mysql非字母顺序?
- 2. 要按顺序排列非序列ID
- 3. 返回ID顺序表后
- 4. Mysql的非顺序插入问题
- 5. MySQL的:顺序分组结果由ID
- 6. 非顺序范围
- 7. 以ID从MySQL表表springboot与URL
- 8. 我可以使用非顺序ID作为回送模型吗?
- 9. 顺序列表的列表与另一
- 10. mysql多列顺序
- 11. MYSQL顺序计数
- 12. mysql字母顺序
- 13. MySQL索引顺序
- 14. 多列顺序MySQL
- 15. mysql多列顺序
- 16. MySQL:如何顺序查询两个表?
- 17. 表不是以相同的顺序mySQL
- 18. 迭代非顺序列
- 19. 非顺序索引集合
- 20. MySQL排序顺序 - 整理?
- 21. mysql排序顺序操作
- 22. 德尔福同步面板顺序与表顺序
- 23. F#SQLProvider列顺序与表中的顺序不匹配
- 24. 获取的JQuery排序的div的顺序与ID的
- 25. Mysql非规范化连接表与many_2_many
- 26. 为输入顺序<输入的ID =“顺序列表”>由PHP
- 27. 基于ID列表的特定记录排序?与MySQL和PHP
- 28. MySQL的 - 如何检查ID和日期顺序
- 29. MySQL的随机顺序保存在数据库中没有ID
- 30. MySQL多行插入是否获取顺序自动增量ID?
从您的链接的第一条评论CREATE TRIGGER sdata_insert BEFORE INSERT ON sometable FOR EACH ROW BEGIN SET NEW.guid = UUID(); END –