主键与唯一约束同时存在的排序问题
这是一张结构简单的表,flag列是主键列,数据类型tinyint,flagname列定义了唯一约束(unique),数据类型varchar(20)。
现在的问题是未按flag进行排序。尝试过:
1、将主键约束删除,就会按flag排序
2、将唯一约束删除,亦会
3、将flag数据类型改为varchar,亦会
请问,如何在保证有主键、有唯一、主键为tinyint的情况下以主键列排序
------最佳解决方案-------------------- select * from TB order by cast(flag as varchar(20))
------其他解决方案-------------------- 排序跟索引有关,但是索引与索引之间会有影响导致数据排序顺序可能不是你想要的。
------其他解决方案-------------------- 直接打开表看看物理存储顺序。
------其他解决方案-------------------- 引用: 引用:
把聚集索引 改成flag 试试
确定flag是聚集,flagname是非聚集。可为什么那么多种条件下都能按主键排序,就是【主键+有唯一约束+主键为数值类型】这三者合一就不能了呢,纠结啊
你可以看执行计划:
因为非聚集索引键是包含聚集键的。
当你查询表的时候并不需要去聚集索引。而是非聚集索引即可。当然是按你索引的顺序显示了。
如果你再多一列.非聚集索引解决不了.自然就按聚集索引来了.
------其他解决方案-------------------- 引用: select * from TB order by cast(flag as varchar(20))
我知道order by了
我是要:
不加order by的情况下,如何让这表自然以主键列进行排序? ------其他解决方案-------------------- 把聚集索引 改成flag 试试
------其他解决方案-------------------- 引用: 把聚集索引 改成flag 试试
确定flag是聚集,flagname是非聚集。可为什么那么多种条件下都能按主键排序,就是【主键+有唯一约束+主键为数值类型】这三者合一就不能了呢,纠结啊
------其他解决方案-------------------- 这个真心不懂
------其他解决方案-------------------- 引用: 直接打开表看看物理存储顺序。
按照flag排列的
------其他解决方案-------------------- SQL77所言:
当你查询表的时候并不需要去聚集索引。而是非聚集索引即可。当然是按你索引的顺序显示了。
如果你再多一列.非聚集索引解决不了.自然就按聚集索引来了.
有道理,如果用到主从表,看来是要修改表结构了。。。。。既然无解,结贴了!