0

尝试创建运行由 Visual Studio 生成的脚本的数据库(实体框架,“从模型生成数据库...”链接)时,我遇到了主键错误。

给我一个问题的命令是

ALTER TABLE tablename
ADD CONSTRAINT constraintname
    PRIMARY KEY NONCLUSTERED (col1, col2 ASC);

我得到的错误是

未创建索引约束名称。该索引的密钥长度为 1024 字节。最大允许密钥长度为 900 字节。

该表是用

CREATE TABLE tablename (
    col1 nchar(256)  NOT NULL,
    col2 nchar(256)  NOT NULL
);

在我看来是 512 字节,而不是 1024。

是什么导致 SQL Server 将其计为 1024,我该如何解决这个问题?

4

3 回答 3

3

nchar is unicode, which takes up two bytes per character.

If you don't need unicode, switch to char. Or shorten your columns, or add separate column(s) to use as a key. Two 512 character strings is a pretty large primary key!

于 2013-07-10T20:15:50.823 回答
2

切换到nvarcharnchar是固定空间数据类型。您可能会浪费 90% 的存储空间。如果要存储 10 个字符的字符串,则需要 256 个字符的空间,这是不必要的浪费。

考虑再varchar增加 50% 的空间。但是你以这种方式失去了 Unicode。

下一个待办事项:阅读文档以熟悉数据类型。有一些棘手的错误要犯。

于 2013-07-10T20:38:40.760 回答
0
CREATE TABLE tablename (
    col1 nvarchar(256)  NOT NULL,
    col2 nvarchar(256)  NOT NULL
);

编辑(Sasha.Sochka 的要求):

nchar 使用固定大小的 n 个字符,即使该值可能适合较小的空间。nvarchar 使用尽可能少的字符空间,而在我们的例子中,它的上限是 256 个字符的空间。所以,如果你有这个'foo',那么如果它是 nchar,它将为 256 个字符分配空间,如果它是 nvarchar,它将为 3 个字符分配空间。

于 2013-07-10T21:50:20.563 回答