Невозможно добавить столбец NOT NULL в пустую таблицу в SQL Server

Я понимаю, что при добавлении столбца в таблицу, содержащую данные на сервере SQL, столбец должен иметь параметр NULL или значение по умолчанию. В противном случае, чем SQL Server дополнил бы новые строки?

Однако я не понимаю, почему я не могу добавить столбец NOT NULL в пустую таблицу. Я пробовал это на двух экземплярах SQL 2008 и одном экземпляре SQL 2005 без проблем. Однако эта проблема возникает у клиента с SQL 2000. Относится ли это к SQL 2000 или это опция, которую вы можете отключить. Будем надеяться, что это вариант.

Select @@Version

Microsoft SQL Server 2000 — 8.00.760 (Intel X86) 17 декабря 2002 г. 14:22:05 Copyright (c) Microsoft Corporation Developer Edition 1988–2003 для Windows NT 5.1 (сборка 2600: пакет обновления 3)

Select count(*) from actinv

0

ALTER TABLE [ActInv] ADD [BATCHNUMBER] NVARCHAR(50) NOT NULL

Сообщение 4901, уровень 16, состояние 1, строка 1 ALTER TABLE позволяет добавлять только столбцы, которые могут содержать значения NULL или иметь указанное определение DEFAULT. Столбец «BATCHNUMBER» не может быть добавлен в таблицу «ActInv», поскольку он не допускает пустых значений и не указывает определение по умолчанию.


person user69374    schedule 30.06.2009    source источник
comment
Я знаю, это звучит глупо, но ДЕЙСТВИТЕЛЬНО ли стол пуст?   -  person Neil N    schedule 30.06.2009
comment
Что ж, я делаю Select count(*) из ActInv, и он возвращает ноль!   -  person user69374    schedule 30.06.2009
comment
Slect count(*) возвращает только те записи, в которых хотя бы один столбец не равен нулю. Я знаю, звучит глупо, но вместо этого попробуйте выбрать * из таблицы.   -  person Neil N    schedule 30.06.2009
comment
Я никогда этого не знал! Select * возвращает ноль строк, я только что проверил.   -  person user69374    schedule 30.06.2009
comment
хорошо, я должен был спросить. Далее, и это тоже может звучать глупо, проверьте разрешения этой таблицы, есть ли у вас ПОЛНЫЙ доступ для чтения/записи к ней?   -  person Neil N    schedule 30.06.2009
comment
Нил Н, ты не прав. создать таблицу b(a int) вставить значения b(null) выбрать count(*) из b -- 1   -  person ErikE    schedule 01.07.2009


Ответы (4)


SQL Server 2000 не проверяет наличие пустой таблицы. Вы видите улучшение в SQL Server 2005/2008.

Любой из следующих двухэтапных процессов произведет изменение в SQL Server 2000 по отношению к пустой таблице:

ALTER TABLE [ActInv] ADD [BATCHNUMBER] NVARCHAR(50) NOT NULL CONSTRAINT ActInv_Temp DEFAULT 'foo'
ALTER TABLE [ActInv] DROP CONSTRAINT ActInv_Temp

go

ALTER TABLE [ActInv] ADD [BATCHNUMBER] NVARCHAR(50) NULL 
ALTER TABLE [ActInv] ALTER COLUMN [BATCHNUMBER] NVARCHAR(50) NOT NULL 
person Shannon Severance    schedule 30.06.2009
comment
Это сработало отлично, за исключением того, что между ИЗМЕНЕНИЕМ таблицы для добавления столбца, допускающего значение NULL, и ИЗМЕНЕНИЕМ таблицы на NOT NULL мне пришлось ОБНОВИТЬ ‹table› SET newcol = ‹value›. SQL не позволит преобразовать столбец, допускающий значение NULL, со всеми нулевыми значениями в столбец NOT NULL. Очевидно на самом деле :-) - person markau; 13.09.2017
comment
@markau, этот ответ относится к проблеме OP, когда у OP была пустая таблица на SQL Server 2000. С пустой таблицей обновление не выполняется и не требуется. SQL Server 2005 и более поздние версии будут проверять таблицу при добавлении ненулевого столбца и продолжать работу, если таблица пуста. - person Shannon Severance; 13.09.2017

У меня нет доступа к 2000 для проверки, но можете ли вы добавить столбец с именованным значением по умолчанию, чтобы оно прошло успешно, а затем просто удалить именованное значение по умолчанию?

person A-K    schedule 30.06.2009
comment
Этот SQL генерируется программой обновления. Я надеялся, что эту опцию можно отключить. Теперь похоже, что мне придется изменить программу, чтобы обойти это так, как вы предлагаете, что отстой. - person user69374; 30.06.2009

В сообщении об ошибке сообщается, что вы не можете добавить новый столбец, поскольку он не допускает пустых значений и не указывает определение ПО УМОЛЧАНИЮ.

Вам нужно добавить значение по умолчанию в ненулевое поле следующим образом:

ALTER TABLE [ActInv] ADD [BATCHNUMBER] NVARCHAR(50) DEFAULT 'foo' NOT NULL

Редактировать: я только что видел, что именно вы делаете на разных установках SQL Server (2000 и 2005). Если таблица действительно пуста, возможно, лучшим решением будет удалить/создать таблицу. Похоже на ошибку в SQL Server 2000.

person Andrew Hare    schedule 30.06.2009
comment
Хм? он уже заявил, что таблица пуста - мне кажется, что вопрос: почему вы можете иметь NOT NULL без определения по умолчанию при создании таблицы, но не можете добавить NOT NULL в пустую таблицу. - person Raj More; 30.06.2009
comment
Вопрос в том, зачем SQL2000 нужно значение DEFAULT, если в таблице нет строк? SQL2005 и SQL2008 - нет! - person user69374; 30.06.2009

Рассматривали ли вы следующие 2 последовательно:

ALTER TABLE [ActInv] ADD [BATCHNUMBER] NVARCHAR(50) 
GO

ALTER TABLE [ActInv] ALTER COLUMN [BATCHNUMBER] NVARCHAR(50) NOT NULL
GO

Я думаю, что это должно работать и на 2000 (у меня только 2005)

person feihtthief    schedule 30.06.2009