【发布时间】:2011-02-25 19:07:15
【问题描述】:
我想在 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”的“i”值day”(但最好不要“howdy”)为新条目腾出空间。
那么,是否有标准的 SQL 模式来执行移位操作,但只移位必要的元素? (请注意,简单的“UPDATE table SET i=i+1 WHERE i>=3”不起作用,因为它违反了 'i' 的唯一性约束,而且它还不必要地更新了“howdy”行。)
或者,有没有更好的方法来表示有序列表?我想您可以将“i”设为浮点值并在它们之间选择值,但是当不存在此类值时,您必须进行单独的重新平衡操作。
或者,如果我要让 'i' 成为 varchar,是否有一些标准算法可以在任意其他字符串之间生成字符串值?
或者我应该将它表示为一个链接列表?我避免这样做是因为我还希望能够执行 SELECT .. ORDER BY 以按顺序排列所有元素。
【问题讨论】:
-
顺便说一句:您的评论 "UPDATE table SET i=i+1 WHERE i>=3" 不起作用,因为它绝对违反了 'i' 的唯一性约束在 SQL Server 中不成立。最后检查约束。你用的是什么关系型数据库?