CREATE TABLE AS your_table (id,title,sort_order) AS VALUES (0,'Lorem ipsum',3),(1,'Dolor sit',2),(2,'Amet,consect',0),(3,'Elit fusce',1);
然后,我们可以按顺序对行进行排序,以便按正确顺序对它们进行排序.
但是,这看起来很笨拙:
>如果我想将记录0移到开头,我必须重新排序每条记录
>如果我想在中间插入一条新记录,我必须重新排序后面的每条记录
>如果我想删除记录,我必须重新排序后面的每条记录
很容易想象以下情况:
>两个记录具有相同的顺序
>记录之间的顺序存在差距
出于多种原因,这些可能相当容易发生.
这是像Joomla这样的应用程序采用的方法:
你可以说这里的界面很糟糕,而不是人类直接编辑数字,他们应该使用箭头或拖放 – 你可能是对的.但在幕后,同样的事情正在发生.
有些人建议使用小数来存储订单,这样你就可以使用“2.5”在第2和第3顺序的记录之间插入一条记录.虽然这有点帮助,但它可能会更加混乱,因为你可以最终得到奇怪的小数(你在哪里停止?2.75?2.875?2.8125?)
有没有更好的方法来存储表中的订单?
解决方法
If I want to move record 0 to the start,I have to reorder every record
不,有一种更简单的方法.
update your_table set order = -1 where id = 0;
If I want to insert a new record in the middle,I have to reorder every record after it
这是真的,除非您使用支持“之间”值的数据类型.浮点数和数字类型允许您将值更新为2.5.但varchar(n)也有效. (想想’a’,’b’,’c’;然后想’ba’,’bb’,’bc’.)
If I want to remove a record,I have to reorder every record after it
不,有一种更简单的方法.只需删除该行即可.其余行仍将正确排序.
It’s easy to imagine a situations like:
Two records have the same order
唯一约束可以防止这种情况.
There are gaps in the order between records
间隙对dbms如何对列中的值进行排序没有影响.
Some people have proposed using a decimal to store order,so that you can use “2.5” to insert a record in between the records at order 2 and 3. And while that helps a little,it’s arguably even messier because you can end up with weird decimals (where do you stop? 2.75? 2.875? 2.8125?)
你不必停下来. dbms对小数点后面有2个,7个或15个位置的值进行排序没有问题.
我认为你真正的问题是你希望以排序顺序看到整数值.你可以做到这一点.
create table your_table ( id int primary key,title varchar(13),sort_order float ); insert into your_table values (0,2.0),1.5),0.0),1.0); -- This windowing function will "transform" the floats into sorted integers. select id,row_number() over (order by sort_order) from your_table