查询结果集顺序不是插入顺序

Rhett 2003-08-24 09:24:00
CREATE TABLE rsccategory
(
categoryid NUMERIC(2) IDENTITY(1,1),
categoryname VARCHAR(20) NOT NULL,
PRIMARY KEY(categoryid)
)
顺序插入:url,document,book,software,casus,project,disert,查询得到录入顺序的结果集(1,...,7)
但是将categoryname定义为
categoryname VARCHAR(20) NOT NULL UNIQUE,
得到的结果集顺序是:book,casus,dissert,document,project,software,url(3,5,7,2,6,4,1)
为什么这样的结果是按categoryname字母排序?

如果此时给categoryname加上CLUSTERED约束
categoryname VARCHAR(20) NOT NULL UNIQUE CLUSTERED
那么结果和第一次的定义一样,即(1..7)

多谢解疑!!!!
...全文
68 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Rhett 2003-08-25
  • 打赏
  • 举报
回复
1.那么显示顺序是什么的顺序呢?

2.既然物理存储顺序是聚簇顺序,那么就不可能是categoryid的顺序了;反过来,为什么在
categoryname VARCHAR(20) NOT NULL,
时,显示的顺序确实录入顺序(同时也是聚簇顺序),这是为什么?
是因为UNIQUE的添加引入了新的索引,所以配套的操作使决定"显示顺序"的因素发生改变.

3.而在categoryname VARCHAR(20) NOT NULL UNIQUE CLUSTERED
因为categoryname引入了聚簇索引,物理存储顺序应该是categoryname的id字母排序,但是显示顺序却是录入顺序,这是为什么?

望大力兄不吝赐教!
prcgolf 2003-08-25
  • 打赏
  • 举报
回复
学习
txlicenhe 2003-08-25
  • 打赏
  • 举报
回复
看大力的。
pengdali 2003-08-25
  • 打赏
  • 举报
回复
存储顺序和显示顺序肯定是不一样的。
参看:
http://expert.csdn.net/Expert/topic/2174/2174194.xml?temp=.8505365
Rhett 2003-08-25
  • 打赏
  • 举报
回复
既然categoryname上面的是非簇索引,而categoryid上面的是簇索引,那么记录集物理存储顺序应该是1,2,3,4,5,6,7,而不是3,5,7,2,6,4,1,
这是问什么呢?为什么反而结果是以categoryname排序呢?
难道返回的记录集顺序不是按照存储顺序来得吗?
pengdali 2003-08-24
  • 打赏
  • 举报
回复
这是应为建立唯一约束的同时建立了非簇索引举例:

1、下面的是簇索引,不会改变你得顺序:

CREATE TABLE #rsccategory
(
categoryid NUMERIC(2) IDENTITY(1,1),
categoryname VARCHAR(20) NOT NULL UNIQUE clustered,
PRIMARY KEY(categoryid)
)

insert #rsccategory select 'url' union all select 'document' union all select 'book' union all select 'software' union all select 'casus' union all select 'project' union all select 'disert'

select * from #rsccategory

2、下面等价于你写的:

CREATE TABLE #rsccategory
(
categoryid NUMERIC(2) IDENTITY(1,1),
categoryname VARCHAR(20) NOT NULL UNIQUE nonclustered, --其实nonclustered可以省略
PRIMARY KEY(categoryid)
)

insert #rsccategory select 'url' union all select 'document' union all select 'book' union all select 'software' union all select 'casus' union all select 'project' union all select 'disert'

select * from #rsccategory

go
drop table #rsccategory


3、说到底是应为有非簇索引:

CREATE TABLE #rsccategory
(
categoryid NUMERIC(2) IDENTITY(1,1),
categoryname VARCHAR(20) NOT NULL,
PRIMARY KEY(categoryid)
)

create index xx on #rsccategory(categoryname)

insert #rsccategory select 'url' union all select 'document' union all select 'book' union all select 'software' union all select 'casus' union all select 'project' union all select 'disert'

select * from #rsccategory

go
drop table #rsccategory

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧