【问题标题】:Column in table is of a type that is invalid for use as a key column in an index表中的列的类型不能用作索引中的键列
【发布时间】:2012-10-19 16:32:42
【问题描述】:

我有一个存储员工详细信息的表。我想更改表并将emp_code 列之一设置为主键。它的数据类型是nvarchar(max),但我无法将其设置为主键。

我运行以下查询:

ALTER TABLE user_master
ADD PRIMARY KEY (emp_code)

但它给了我一个错误:

消息 1919,第 16 级,状态 1,第 1 行
user_master 中的列 emp_code 的类型无法用作中的键列一个索引。
消息 1750,级别 16,状态 0,第 1 行
无法创建约束。查看以前的错误。

我该如何克服这个问题?

【问题讨论】:

  • Blob 列不能用于索引,它们需要是固定大小的。
  • 必须是MAX吗? SQL Server 告诉您不能将其作为键类型。为什么不把它缩短为有用的东西呢?
  • 您的 emp_code 列太宽:stackoverflow.com/questions/2863993/…

标签: sql sql-server sql-server-2008


【解决方案1】:

是的,你是对的。警告!最大密钥长度为 900 字节。索引PK__bookmark__2DFA2B0E164452B1 的最大长度为 2000 字节。对于较大值的某些组合,插入/更新操作将失败。 不使用varchar(max)

【讨论】:

    【解决方案2】:

    您不能使用varchar(max)。它不是为存储主键而设计的。

    找出最长的员工代码,并创建一个大小合适的 nvarchar 以涵盖最长的情况。

    例如最长员工代码为 70 个字符,请尝试:-

    nvarchar(100)
    

    ...只是为了掩饰自己。

    【讨论】:

    • NVARCHAR(100) 可能会更好,考虑到现在是NVARCHAR
    • 按照ta的cmets修改。
    【解决方案3】:

    索引的键总大小不能超过 900 字节。将数据类型更改为NVARCHAR(450)。如果这不合适,请使用代理键(通常是 IDENTITY 列)。

    【讨论】:

    • 对所需大小的疯狂猜测;),如果需要全部 2 GB 怎么办。
    • @010001100110000101110010011010 这是NVARCHAR(x)主键的最大可能大小。
    • 太棒了!!大小是问题。我将它设置为 450,(这是最大值)并且它起作用了。谢谢。
    • 非常真实的密钥大小限制是 900 字节。
    • 另外:即使您在技术上也可以将NVARCHAR(450) 列设为主键 - 如果您碰巧也将其设为 集群键那张桌子 - 你会有非常糟糕的表现。您的所有非聚集索引都将是巨大且低效的,并且您的查询将需要读取比实际需要更多的页面。 良好的集群键 应该是 NARROW - 哎呀,我什至说 GUID 的 16 字节太多了!不要使用过大和可变长度的集群键!
    猜你喜欢
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2019-05-25
    • 2011-10-16
    • 2020-04-18
    相关资源
    最近更新 更多