一个索引/排序列,它易于生成插入值之间的值



我想用;"可插入索引键";,我指的是

  1. 我可以在值A和A旁边的值之间插入一些随机数据,比如20->(插入数据(->21

  2. 我可以使用密钥(可能是唯一密钥(对数据进行操作,如getByKey、deleteByKey等。

  3. 我可以在键之间进行比较,就像我知道的那样,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. 我必须自己维护整个生成算法,这非常复杂。我必须检查同一位置是否有值,或者进行一些比较,然后决定是否扩展数字
  2. 如果我设法解决了问题1,我必须添加线程安全代码,这要复杂得多

我尝试过的-有多列

我不认为多列是解决方案,我想保持简单。但如果有使用多列的解决方案,我真的很想听听

问题

你能给出一个解决方案吗?欢迎提出任何建议。

您正在描述自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生成,你说你觉得这很不方便。

正如您所说,要使其线程安全,需要锁定行的范围,这样就可以防止出现争用情况。

我不认为有任何解决方案可以像自动递增整数一样自动执行您想要的操作。您将不得不实现一些代码。

最新更新