有沒有辦法在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. 返回ID順序表後
- 5. Mysql的非順序插入問題
- 6. MySQL ID PRIMARY KEY AUTO_INCREMENT不按順序
- 7. MySQL的:順序分組結果由ID
- 8. 快速從mysql表中選擇隨機ID與數百萬的非順序記錄
- 9. PHP MySQL的順序列表
- 10. MySQL「非唯一ID」
- 11. 散貨指數數據與順序ID
- 12. 非順序範圍
- 13. 以車ID和投入順序表
- 14. 排序在非增順序
- 15. 非標準排序順序
- 16. 排序和計數與非唯一ID
- 17. 通過id按照與ID列表相同的順序排列對象
- 18. 與設定的順序在MySQL
- 19. mysql命令按組與字母順序
- 20. 組通過與順序的MySQL通過
- 21. MYSQL與DATE_FORMAT的日期順序
- 22. 以ID從MySQL表表springboot與URL
- 23. MYSQL導出值和非ID
- 24. 我可以使用非順序ID作爲回送模型嗎?
- 25. MySQL更新按順序與來自同一表的值
- 26. 順序列表的列表與另一
- 27. MYSQL順序計數
- 28. mysql多列順序
- 29. MySQL索引順序
- 30. mysql字母順序
從您的鏈接的第一條評論CREATE TRIGGER sdata_insert BEFORE INSERT ON sometable FOR EACH ROW BEGIN SET NEW.guid = UUID(); END –