我想要在SQL表中表示列表 "hi", "hello", "goodbye", "good day", "howdy"(按照这个顺序):
pk | i | val
------------
1 | 0 | hi
0 | 2 | hello
2 | 3 | goodbye
3 | 4 | good day
5 | 6 | howdy
'pk'是主键列。忽略它的值。
'i'是“索引”,用于定义'val'列中数值的顺序。它仅用于确定顺序,而数值本身并不重要。
我遇到的问题是在保持顺序的同时向列表中插入值。例如,如果我想插入"hey",并且希望它出现在"hello"和"goodbye"之间,那么我必须移动"goodbye"和"good day"的'i'值(但最好不要移动"howdy")以为新条目腾出位置。
那么,是否有一种标准的SQL模式来执行移位操作,但只移动必要的元素?(请注意,简单的“UPDATE table SET i=i+1 WHERE i>=3”不起作用,因为它违反了' i '上的唯一性约束,并且还不必要地更新了“howdy”行。)
或者,有没有更好的方法来表示有序列表?我想你可以将'i'设置为浮点值,并选择介于值之间的值,但那么你必须有一个单独的重新平衡操作,当不存在这样的值时。
还是有标准的算法可以生成任意其他字符串之间的字符串值,如果我将'i'作为varchar?
还是我应该将其表示为链表?我之所以避免这样做,是因为我希望也能够执行SELECT..ORDER BY以按顺序获取所有元素。