警告!最大密钥长度为900字节。索引的最大长度为1000字节。

35
我将一个数据库脚本从64位系统转移到32位系统。当我执行脚本时,它会给我以下错误信息,

警告!最大键长度为900字节。索引“UQ__Users__7E800015145C0A3F”的最大长度为1000字节。对于某些大值的组合,插入/更新操作将失败。

谷歌搜索和Stack Overflow问题没有帮助解决这个问题。

请说明您正在使用哪种数据库管理系统? - user170442
SQL Express Server 10.50.2500 - ShodowOverRide
可能是字符长度为900字节的索引大小限制的重复问题。 - Cyril Durand
4
我通过将 NVARCHAR(512) 修改为 NVARCHAR(450) 来解决这个问题,因为在我的情况下,2 * SIZE = 2 * 450 = 900 字节。但是,这只是有限制的,因为我给该字段添加了 UNIQUE 属性。 - Alexandru
伟大的解决方案。顺便提一下,从 SQL Server 2016 开始SHA1已被弃用,应该使用SHA2_256或SHA2_512,根据微软的说法: https://learn.microsoft.com/en-us/sql/t-sql/functions/hashbytes-transact-sql?view=sql-server-ver15 - gg89
3个回答

12

对于那些具有较大尺寸的列,SQL Server 仅索引大小不超过 900 字节的列。

为了解决这个问题

首先:我添加了一个名为 hashCol 的列来为 MyCol 生成 SHA1 类型的哈希码。

alter table myTable
    add 
    hashCol AS HASHBYTES('SHA1', CONVERT(VARCHAR(90), MyCol))

其次:我为hashCol添加了一个唯一约束,以确保唯一标识MyCol。

 ALTER  TABLE  myTable
     ADD CONSTRAINT hashCol_Unique UNIQUE (hashCol)

通过这种方式,我解决了索引列具有大尺寸的问题。

参考资料

在SQL Server中为字段生成唯一哈希值


出现错误:“表'MyTable'中的列'HashCol'不能用作索引、统计信息或分区键,因为它是非确定性的。”如何解决? - LCJ
为了确保索引起作用,我宁愿这样做: hashCol作为convert(varchar(100), hashbytes('SHA1', MyCol), 2)持久化非空 - Mike O.
1
这个方法还可以,但一定要确保这种方式不会在你的数据库中产生冲突,我曾经遇到过这种情况。 - HamiltonPharmD

4

Varchar类型的存储长度将会增加2个字节。

解决方案

ALTER TABLE table_name
ALTER COLUMN column_name varchar(255)

尝试将列长度减少为255个字符,并尝试建立索引。


1
如果您能够在不截断字段数据的情况下将其缩小为varchar(900),则可以这样做。 - secretwep

2

所有列的长度总和应小于900。

-- make combined colum length(to be indexed / add constrains) less <= 900
ALTER TABLE tabbleName ALTER COLUMN col1 VARCHAR (500) NULL;
ALTER TABLE tabbleName ALTER COLUMN col2 VARCHAR (200) NULL;
ALTER TABLE tabbleName ALTER COLUMN col3 VARCHAR (200) NULL;
-- Then add the index
ALTER TABLE tabbleName ADD CONSTRAINT uck UNIQUE (col1, col2, col3);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接