如何改变复合主键中varchar的长度?

eva*_*ard 16 sql-server sql-server-2005 constraints primary-key sql-server-2008

在MSSQL中,我有一个像这样创建的表:

CREATE TABLE [mytable] (fkid int NOT NULL, data varchar(255) CONSTRAINT DF_mytable_data DEFAULT '' NOT NULL);
ALTER TABLE [mytable] ADD CONSTRAINT PK_mytable_data PRIMARY KEY (fkid, data);
Run Code Online (Sandbox Code Playgroud)

现在我想将'data'列的长度从255增加到4000.

如果我只是尝试:

ALTER TABLE [mytable] ALTER COLUMN data varchar(4000);
Run Code Online (Sandbox Code Playgroud)

然后我收到这个错误:

The object 'PK_mytable_data' is dependent on the column 'data'
Run Code Online (Sandbox Code Playgroud)

如果我试试这个:

ALTER TABLE [mytable] DROP CONSTRAINT PK_mytable_data;
ALTER TABLE [mytable] ALTER COLUMN data varchar(4000);
ALTER TABLE [mytable] ADD CONSTRAINT PK_mytable_data PRIMARY KEY (fkid, data);
Run Code Online (Sandbox Code Playgroud)

然后我收到这个错误:

Cannot define PRIMARY KEY constraint on nullable column in table 'mytable'
Run Code Online (Sandbox Code Playgroud)

我错过了什么?这两列都是用NOT NULL定义的,那么为什么MSSQL报告它放弃之后无法重新创建这个约束呢?

谢谢!埃文

Qua*_*noi 20

通过将数据类型更改为varchar(4000),您可以接受它NULLs.

试试这个:

ALTER TABLE [mytable] DROP CONSTRAINT PK_mytable_data;
ALTER TABLE [mytable] ALTER COLUMN data varchar(4000) NOT NULL;
ALTER TABLE [mytable] ADD CONSTRAINT PK_mytable_data PRIMARY KEY (fkid, data);
Run Code Online (Sandbox Code Playgroud)

请注意,索引大小(隐式创建PK)仅限于900字节,更大值的插入将失败.

  • `@ evan.leonard`:实际上,`896`,因为`fkid`也需要'4`字节来存储. (2认同)