日期:2014-05-17  浏览次数:20484 次

主键与唯一约束同时存在的排序问题


这是一张结构简单的表,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所言:
当你查询表的时候并不需要去聚集索引。而是非聚集索引即可。当然是按你索引的顺序显示了。

如果你再多一列.非聚集索引解决不了.自然就按聚集索引来了.


有道理,如果用到主从表,看来是要修改表结构了。。。。。既然无解,结贴了!