Как изменить длину varchar в составном первичном ключе?

В 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);

Теперь я хочу увеличить длину столбца 'данных' от 255 до 4 000.

Если я просто пробую:

ALTER TABLE [mytable] ALTER COLUMN data varchar(4000);

Тогда я получаю эту ошибку:

The object 'PK_mytable_data' is dependent on the column 'data'

Если я пробую это:

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);

Тогда я получаю эту ошибку:

Cannot define PRIMARY KEY constraint on nullable column in table 'mytable'

Что я пропускаю? Оба столбца были определены с NOT NULL, итак, почему MSSQL сообщает, что не может воссоздать это ограничение после того, как я отбрасываю его?

Спасибо! Evan

16
задан evan.leonard 11 January 2010 в 16:48
поделиться

2 ответа

Требование, чтобы все (нестатические) внутренние классы нуждаются в ссылке на их внешний класс, налагается Java, а не Groovy. Если вы создаете внутренний класс из нестатического метода, ссылка должна быть установлена ​​на это . Тем не менее, нет этого ссылки в статическом методе.

Чтобы исправить проблему:

  • интунтинтировать внутренний класс из нестатического метода
  • сделать внутренний класс статическим. Тогда вы можете создать его в любом месте (но он больше не будет иметь ссылку на экземпляр внешнего класса).
-121--2835619-

, Изменяя dataType на 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);

Обратите внимание, что размер индекса (который неявно создает для Pk ), ограничен 900 байтами и вставками больших значений.

20
ответ дан 30 November 2019 в 21:36
поделиться

Не удивляйтесь, если вы получаете предупреждение при создании этого индекса в конце концов, вы даете ему возможность создать ключ индекса, превышающую допустимую 900 байтов. (Поскольку PK будет либо кластеризованный индекс (по умолчанию), либо индекс NC, обеспечивающим его индекс.)

2
ответ дан 30 November 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: