VS2017/AspNetCore身份模型AspNetUserLogins表与SQL Server索引键大小疑问
这个组合主键确实会超出SQL Server的索引键大小限制
嘿,这个问题问到点子上了——咱直接给结论:这个LoginProvider+ProviderKey的组合主键肯定会超出SQL Server的索引键大小限制,下面给你掰扯清楚来龙去脉:
- 先算个字节账
SQL Server里nvarchar是Unicode编码(默认用UTF-16),每个字符要占2字节。那两个nvarchar(450)字段的最大总字节数就是:
450 × 2 + 450 × 2 = 1800 字节
SQL Server的硬规矩
SQL Server对索引键的大小卡得很死:- 要是主键用的是聚集索引(这是默认设置),那索引键总大小绝对不能超过900字节——这个限制从老版本到现在都没变过。
- 就算你把主键改成非聚集索引,SQL Server 2016及以后版本也只放宽到1700字节,1800字节还是超了。
实际创建时会咋样?
你要是直接执行这个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
相关产品推荐
相关产品推荐

