【问题标题】:Warning! The maximum key length is 900 bytes. The index has maximum length of 1000 bytes警告!最大密钥长度为 900 字节。索引的最大长度为 1000 字节
【发布时间】:2023-03-31 03:47:01
【问题描述】:

我将一个 db 脚本从 64 位系统传输到 32 位系统。当我执行脚本时,它给了我以下错误,

警告!最大密钥长度为 900 字节。指数 'UQ__Users__7E800015145C0A3F' 的最大长度为 1000 字节。为了 一些大值的组合,插入/更新操作将 失败。

Google 结果和 Stack Overflow 问题无助于解决这个问题。

【问题讨论】:

  • 请说明您使用的是什么DBMS?
  • sql express server 10.50.2500
  • 我通过将NVARCHAR(512) 更改为NVARCHAR(450) 解决了这个问题,因为在我的情况下,2 * SIZE = 2 * 450 = 900 字节。但是,它只是有限的,因为我向该字段提供了UNIQUE
  • 很好的解决方案。从 sql server 2016 起,sha1 已被弃用,应该根据微软的 sha2_256 或 sha2_512:docs.microsoft.com/en-us/sql/t-sql/functions/…

标签: sql-server key


【解决方案1】:

varchar 类型的存储长度将是 +2。

解决方案

ALTER TABLE table_name
ALTER COLUMN column_name varchar(255)

所以尝试将列长度减少到 255 个字符并尝试索引。

【讨论】:

  • ...或减少到 varchar(900) 如果您能够在不截断字段数据的情况下这样做。
【解决方案2】:

对于大尺寸的索引列,sqlserver 仅索引 最大为 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)

通过这种方式,我克服了索引大尺寸列的问题

参考资料

Generate Unique hash for a field in SQL Serverin-sql-server

【讨论】:

  • 收到错误“表 'MyTable' 中的列 'HashCol' 不能用于索引或统计信息或作为分区键,因为它是不确定的。”。如何解决?
【解决方案3】:

所有列的总长度应小于 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-05
    • 2011-09-03
    • 2012-02-03
    • 1970-01-01
    • 2012-08-04
    • 2017-02-27
    相关资源
    最近更新 更多