我想創建一個帶有“可插入索引鍵”的列,我的意思是
我可以在值 A 和 A 旁邊的值之間插入一些隨機資料,例如 20 -> (insert data) -> 21
我可以使用密鑰(可能是唯一密鑰)對資料進行操作,例如 getByKey、deleteByKey 等。
我可以在鍵之間進行比較,就像我知道的那樣,20 到 30 之間的值大于 20 小于 30(值不必是數字,比較不必是數字比較)
我嘗試過的 - 使用主鍵 auto_increment
顯然在這種情況下我不能使用 auto_increment pk,我不能在 id=20 和 id=21 之間插入
我嘗試過的 - 使用 varchars
可能我可以使用 varchars,例如:
# column type varchar(10) - original data
"20"
"21"
# insert 2 item between 20 and 21
"20"
"201" <- insert first
"202" <- insert second
"21"
# insert 1 item between 201 and 202
"20"
"201"
"2011" <- insert
"202"
"21"
這里的問題是
- 我必須自己維護整個生成演算法,這非常復雜。我必須檢查同一位置是否有值,或者進行一些比較并必須決定是否擴展數字
- 如果我設法解決問題 1,我必須添加執行緒安全代碼,這要復雜得多。
我嘗試過的 - 多列
我不認為多列是這里的解決方案,我想保持簡單。但是如果有使用多列的解決方案,我真的很想聽聽。
問題
你能給出一個解決方案嗎?任何建議表示贊賞。
uj5u.com熱心網友回復:
您正在描述自 1964 年以來每個 BASIC 程式員所處理的內容。:-)
您可以使用 FLOAT 或 DOUBLE 列作為主鍵,因此您可以繼續在現有主鍵值之間插入小數值。鑒于這些資料型別的大小是固定的,因此精度是有限制的,但是從您的問題中不清楚您必須在值之間插入新行的頻率。
create table mytable ( id float primary key );
insert into mytable (id) values (20), (21);
insert into mytable (id) values (20.5);
insert into mytable (id) values (20.75);
select * from mytable;
-------
| id |
-------
| 20 |
| 20.5 |
| 20.75 |
| 21 |
-------
這也需要您自己管理 id 生成,您說這很不方便。
正如您所說,使其成為執行緒安全的將需要您鎖定行范圍,因此您可以防止競爭條件。
我認為沒有任何解決方案可以像自動遞增整數一樣自動執行您想要的操作。你將不得不實作一些代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/516984.html
標籤:mysqlsql
