You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS2017/AspNetCore身份模型AspNetUserLogins表与SQL Server索引键大小疑问

这个组合主键确实会超出SQL Server的索引键大小限制

嘿,这个问题问到点子上了——咱直接给结论:这个LoginProvider+ProviderKey的组合主键肯定会超出SQL Server的索引键大小限制,下面给你掰扯清楚来龙去脉:

  1. 先算个字节账
    SQL Server里nvarchar是Unicode编码(默认用UTF-16),每个字符要占2字节。那两个nvarchar(450)字段的最大总字节数就是:
450 × 2 + 450 × 2 = 1800 字节
  1. SQL Server的硬规矩
    SQL Server对索引键的大小卡得很死:

    • 要是主键用的是聚集索引(这是默认设置),那索引键总大小绝对不能超过900字节——这个限制从老版本到现在都没变过。
    • 就算你把主键改成非聚集索引,SQL Server 2016及以后版本也只放宽到1700字节,1800字节还是超了。
  2. 实际创建时会咋样?
    你要是直接执行这个CREATE语句,SQL Server会立马给你抛错,说没法创建这个主键索引,因为总键长度超了允许的最大值。

那为啥ASP.NET Core Identity会生成这种脚本?其实这是因为Identity是跨数据库设计的,像PostgreSQL、MySQL这类数据库就没这么严的索引大小限制。要是想在SQL Server里正常用这个表,你得调整字段长度:比如把两个字段改成nvarchar(400),总最大字节数就变成1600,刚好符合SQL Server 2016+非聚集索引的限制;或者改成nvarchar(225),凑够900字节满足聚集索引的要求。

补充个偏门方案:要是你非要保留nvarchar(450)的长度,可以把主键设为非聚集,再手动加个基于UserId的聚集索引——但这会多占存储,一般不推荐这么干。

内容的提问来源于stack exchange,提问作者user844705

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:46:16