UNIQUE 约束对长度有要求? 索引或主键的总字节数不应超过900字节

mixdd 2009-07-05 12:31:22
CREATE TABLE SearchSource (
Id int identity(1,1) not NULL,
Linktype nvarchar(1000),
CONSTRAINT uc_SearchSource1 UNIQUE (Linktype )
)

错误的提示:“索引或主键的总字节数不应超过900字节”

该如何处理呢
...全文
1012 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
cj20523 2011-06-30
  • 打赏
  • 举报
回复
楼主的问题解决了吗?
什么叫 再加一列符合条件的,建索引...可以给解释一下吗?
mixdd 2009-07-06
  • 打赏
  • 举报
回复
谢谢 hui_hui_2007

你要判断一个 varchar 型字段是否重复吗?而且这个 varchar 型字段是一个描述信息吗?
如果这样,就要修改设计思路了。字符太多的描述信息是不好比较是否相同的。

是这样的
_____________________________________________________

最后建一个代码,表中存代码,通过代码链接你想用的描述信息。

这个是怎么实现?存代码映射需要unique的字段?
hui_hui_2007 2009-07-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mixdd 的回复:]
我是想让数据库自己判断是否重复 因为插入的行太多
都取出来遍历的话 太消耗内存了
让数据库自己来判断 不是建立索引 是做CONSTRAINT unique
不过好像本质都一样

有啥比较好的方法么
判断是否重复只能全部取出来遍历么?
[/Quote]
你要判断一个 varchar 型字段是否重复吗?而且这个 varchar 型字段是一个描述信息吗?
如果这样,就要修改设计思路了。字符太多的描述信息是不好比较是否相同的。
最后建一个代码,表中存代码,通过代码链接你想用的描述信息。

不知我的理解对不对。
hui_hui_2007 2009-07-06
  • 打赏
  • 举报
回复
建一个
linktypeid 与 linktypename 的对照表,比如:

id,name
1,'www.shou.com'
2,'www.baidu.com'
3,'www.csdn.net'

然后在表中保存id,在id上建索引,然后用id链接 linktypename.
但好象这个也无法满足你的需求。

好象在客户端程序中判断更好些。1000字符,并不大的。
子陌红尘 2009-07-05
  • 打赏
  • 举报
回复
索引键的最大值
Microsoft® SQL Server™ 2000 保留 900 字节的最大索引键值限制,但更改了 CREATE INDEX 检查指定索引键是否超出允许的 900 字节最大键值时所使用的算法。新的 CREATE INDEX 算法与用于 CREATE TABLE 的行大小算法类似。

Microsoft SQL Server 7.0 版和更早的版本在检查 CREATE INDEX 语句所指定的键是否超出 900 字节时始终使用可变列的最大大小,例如:

CREATE TABLE TestTable
(PrimaryKey int PRIMARY KEY,
VarCharCol1 varchar(500),
VarCharCol2 varchar(500)
)
-- This statement fails because the maximum sizes
-- of the two columns exceeds 900 bytes:
CREATE INDEX TestIdx ON TestTable(VarCharCol1, VarCharCol2)

在 SQL Server 2000 中,上面的 CREATE INDEX 语句将成功执行但出现警告消息,除非一个或更多的数据行生成的键值超出 900 字节。

SQL Server 2000 CREATE INDEX 语句使用以下算法:

若所有固定列的大小加上 CREATE INDEX 语句指定的所有可变列的最大大小小于 900 字节,CREATE INDEX 语句将成功执行且不出现警告或错误。


若所有固定列的大小加上所有可变列的最大大小超过 900 字节,但是所有固定列的大小加上所有可变列的最小大小小于 900 字节,CREATE INDEX 语句将成功执行但出现一条警告,指出如果后续 INSERT 或 UPDATE 语句指定的值所生成的键值大于 900 字节,该语句将失败。若表中现有数据行的值所生成的键值大于 900 字节,CREATE INDEX 语句将失败。若后续 INSERT 或 UPDATE 语句指定的数据值所生成的键值大于 900 字节,该语句将失败。


若所有固定列的大小加上 CREATE INDEX 语句指定的所有可变列的最小大小大于 900 字节,CREATE INDEX 语句将失败。
下表显示创建某类索引的结果,这类索引的键只包含固定列或可变长度列。

索引列


固定数据列的大小 可变长度列的最大大小 索引键列长度总和的最大值*


是否创建索引



消息 由于索引键值过大导致 INSERT 或 UPDATE 运行时错误
> 900 字节 无 不相关 否 错误 索引没有生成错误。
<=900 字节 无 不相关 是 无 否
无 <=900 字节 不相关 是 无 否
无 > 900 字节 > 900 字节 否 错误 索引没有生成错误。
无 > 900 字节 <=900 字节 是 警告 仅当所有索引列的当前长度之和大于 900 字节。


*在执行 CREATE INDEX 语句时,表中的任何行都不能有总长度超过 900 字节的索引键值。

下表显示创建某类索引的结果,这类索引的键包含由固定列和可变长度列组成的混合类型。

索引列
可变长度列的最小大小 + 固定数据列的大小 可变长度列的最大大小 + 固定数据列的大小

索引键列长度总和的最大值*




是否创建索引





消息
由于索引键值过大导致 INSERT 或 UPDATE 运行时错误
> 900 字节 不相关 不相关 否 错误 索引没有生成错误。
<=900 字节 <=900 字节 不相关 是 无 否。
<=900 字节 > 900 字节 <=900 字节 是 警告 仅当所有索引列的当前长度之和大于 900 字节。
<=900 字节 > 900 字节 > 900 字节 否 错误 索引没有生成错误。


*在执行 CREATE INDEX 语句时,表中的任何行都不能有总长度超过 900 字节的索引键值。
hui_hui_2007 2009-07-05
  • 打赏
  • 举报
回复
索引列的大小是有限制的。学习
Cyanapple_wen 2009-07-05
  • 打赏
  • 举报
回复
进来学习
mixdd 2009-07-05
  • 打赏
  • 举报
回复
我是想让数据库自己判断是否重复 因为插入的行太多
都取出来遍历的话 太消耗内存了
让数据库自己来判断 不是建立索引 是做CONSTRAINT unique
不过好像本质都一样

有啥比较好的方法么
判断是否重复只能全部取出来遍历么?
hui_hui_2007 2009-07-05
  • 打赏
  • 举报
回复
应该是有限制的。再说,索引列太大了,建索引就什么意义呢?
举个极端的例子,索引大到整个记录的长度了,建不建索引没有意义,还不如表扫描呢?
字典的目录就好象是索引,这个目录就是几页。可是一本字典会几百页。
如果目录就占500页,要不要目录有什么用呢?
devilidea 2009-07-05
  • 打赏
  • 举报
回复
学习
mixdd 2009-07-05
  • 打赏
  • 举报
回复

再加一列符合条件的,建索引...




你的意思是说只有设置一个小于900字节的么?
ChinaJiaBing 2009-07-05
  • 打赏
  • 举报
回复
CREATE TABLE SearchSource (
Id int identity(1,1) not NULL,
Linktype nvarchar(1000),
CONSTRAINT uc_SearchSource1 UNIQUE (Linktype )
)

错误的提示:“索引或主键的总字节数不应超过900字节”

该如何处理呢

再加一列符合条件的,建索引...



34,590

社区成员

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

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