yob*_*ioo 6 sql-server sql-server-2012
当我使用 SSMS GUI 在 varchar(1024) 列上创建索引时,它失败并显示以下消息:
"Warning! The maximum key length is 900 bytes. The index 'XXX' has maximum length of 1024 bytes. For some combination of large values, the insert/update operation will fail."
Run Code Online (Sandbox Code Playgroud)
但是,当我使用 SQL(不是 GUI)时,同样的操作成功了。我不确定为什么会发生这种情况,但这是否意味着索引会一直工作,直到超过 900 字节的数据真正插入到列中?
(该列当前没有超过 900 字节的值。)
环境: - SQL Sever 2012 - Windows Server 2008 R2 SP1
Joh*_* N. 14
如果在定义长度超过 900 或 1700(取决于索引的版本和类型)的列上创建索引,您将收到警告并且索引创建将成功(如果表为空或现有数据不是那么长)或错误并且索引创建将失败(如果一行或更多行超过限制)。
对于警告情况,限制为:
如果您在varchar(>900)
列上创建聚集索引,您将在创建索引时收到警告。
如果您在varchar(>900)
列上创建非聚集索引,您将在创建索引时收到警告消息。
如果您在varchar(>900)
列上创建聚集索引,您将在创建索引时收到一条警告消息。
如果您在varchar(>1700)
列上创建非聚集索引,您将在创建索引时收到警告消息。
如果您插入的数据不超过索引和 SQL Server 版本的限制,那么您将不会在您的应用程序/SSMS/SQL 查询/...
但是,插入超过版本和索引类型指定的限制将导致错误消息。
您可以在db<>fiddle 上尝试一下。测试示例下方提供了每个测试的链接。
Run Code Online (Sandbox Code Playgroud)CREATE TABLE VarcharNonClustered ( ID INT ,Name VARCHAR(2000) ) GO
?
Run Code Online (Sandbox Code Playgroud)CREATE NONCLUSTERED INDEX idx_VarcharNonClustered_Name ON VarcharNonClustered(Name) GO
? 警告!最大密钥长度为 900 字节。索引“idx_VarcharNonClustered_Name”的最大长度为 2000 字节。对于某些大值组合,插入/更新操作将失败。
Run Code Online (Sandbox Code Playgroud)INSERT INTO VarcharNonClustered VALUES (1,REPLICATE('a',1701)) GO
Msg 1946 Level 16 State 3 Line 1 手术失败。索引 'idx_VarcharNonClustered_Name' 的长度为 1701 字节的索引条目超过了最大长度 900 字节。
Run Code Online (Sandbox Code Playgroud)INSERT INTO VarcharNonClustered VALUES (1,REPLICATE('a',1700)) GO
Msg 1946 Level 16 State 3 Line 1 手术失败。索引“idx_VarcharNonClustered_Name”的长度为 1700 字节的索引条目超过了最大长度 900 字节。
Run Code Online (Sandbox Code Playgroud)INSERT INTO VarcharNonClustered VALUES (1,REPLICATE('a',901)) GO
Msg 1946 Level 16 State 3 Line 1 手术失败。索引 'idx_VarcharNonClustered_Name' 的长度为 901 字节的索引条目超过了 900 字节的最大长度。
Run Code Online (Sandbox Code Playgroud)INSERT INTO VarcharNonClustered VALUES (1,REPLICATE('a',900)) GO
1 行受影响
db<>在这里摆弄
Run Code Online (Sandbox Code Playgroud)CREATE TABLE VarcharClustered ( ID INT ,Name VARCHAR(2000) ) GO
?
Run Code Online (Sandbox Code Playgroud)CREATE CLUSTERED INDEX idx_VarcharClustered_Name ON VarcharClustered(Name) GO
? 警告!最大密钥长度为 900 字节。索引“idx_VarcharClustered_Name”的最大长度为 2000 字节。对于某些大值组合,插入/更新操作将失败。
Run Code Online (Sandbox Code Playgroud)INSERT INTO VarcharClustered VALUES (1,REPLICATE('a',1701)) GO
Msg 1946 Level 16 State 3 Line 1 手术失败。索引 'idx_VarcharClustered_Name' 的长度为 1701 字节的索引条目超过了最大长度 900 字节。
Run Code Online (Sandbox Code Playgroud)INSERT INTO VarcharClustered VALUES (1,REPLICATE('a',1700)) GO
Msg 1946 Level 16 State 3 Line 1 手术失败。索引“idx_VarcharClustered_Name”的长度为 1700 字节的索引条目超过了最大长度 900 字节。
Run Code Online (Sandbox Code Playgroud)INSERT INTO VarcharClustered VALUES (1,REPLICATE('a',901)) GO
Msg 1946 Level 16 State 3 Line 1 手术失败。索引 'idx_VarcharClustered_Name' 的长度为 901 字节的索引条目超过了 900 字节的最大长度。
Run Code Online (Sandbox Code Playgroud)INSERT INTO VarcharClustered VALUES (1,REPLICATE('a',900)) GO
1 行受影响
db<>在这里摆弄
Run Code Online (Sandbox Code Playgroud)CREATE TABLE VarcharNonClustered ( ID INT ,Name VARCHAR(2000) ) GO
?
Run Code Online (Sandbox Code Playgroud)CREATE NONCLUSTERED INDEX idx_VarcharNonClustered_Name ON VarcharNonClustered(Name) GO
? 警告!非聚集索引的最大键长度为 1700 字节。索引“idx_VarcharNonClustered_Name”的最大长度为 2000 字节。对于某些大值组合,插入/更新操作将失败。
Run Code Online (Sandbox Code Playgroud)INSERT INTO VarcharNonClustered VALUES (1,REPLICATE('a',1701)) GO
Msg 1946 Level 16 State 3 Line 1 手术失败。索引“idx_VarcharNonClustered_Name”的长度为 1701 字节的索引条目超过了非聚集索引的最大长度 1700 字节。
Run Code Online (Sandbox Code Playgroud)INSERT INTO VarcharNonClustered VALUES (1,REPLICATE('a',1700)) GO
1 行受影响
Run Code Online (Sandbox Code Playgroud)INSERT INTO VarcharNonClustered VALUES (1,REPLICATE('a',901)) GO
1 行受影响
Run Code Online (Sandbox Code Playgroud)INSERT INTO VarcharNonClustered VALUES (1,REPLICATE('a',900)) GO
1 行受影响
db<>在这里摆弄
Run Code Online (Sandbox Code Playgroud)CREATE TABLE VarcharClustered ( ID INT ,Name VARCHAR(2000) ) GO
?
Run Code Online (Sandbox Code Playgroud)CREATE CLUSTERED INDEX idx_VarcharClustered_Name ON VarcharClustered(Name) GO
? 警告!聚集索引的最大键长度为 900 字节。索引“idx_VarcharClustered_Name”的最大长度为 2000 字节。对于某些大值组合,插入/更新操作将失败。
Run Code Online (Sandbox Code Playgroud)INSERT INTO VarcharClustered VALUES (1,REPLICATE('a',1701)) GO
Msg 1946 Level 16 State 3 Line 1 手术失败。索引“idx_VarcharClustered_Name”的长度为 1701 字节的索引条目超过了聚集索引的最大长度 900 字节。
Run Code Online (Sandbox Code Playgroud)INSERT INTO VarcharClustered VALUES (1,REPLICATE('a',1700)) GO
Msg 1946 Level 16 State 3 Line 1 手术失败。索引“idx_VarcharClustered_Name”的长度为 1700 字节的索引条目超过了聚集索引的最大长度 900 字节。
Run Code Online (Sandbox Code Playgroud)INSERT INTO VarcharClustered VALUES (1,REPLICATE('a',901)) GO
Msg 1946 Level 16 State 3 Line 1 手术失败。索引“idx_VarcharClustered_Name”的长度为 901 字节的索引条目超过了聚集索引的最大长度 900 字节。
Run Code Online (Sandbox Code Playgroud)INSERT INTO VarcharClustered VALUES (1,REPLICATE('a',900)) GO
1 行受影响
db<>在这里摆弄
在 varchar(1024) 列上创建索引成功。它有效吗?
它将在上述限制下工作。
归档时间: |
|
查看次数: |
11445 次 |
最近记录: |