Подтвердить что ты не робот

Могу ли я добавить столбец не null без значения DEFAULT

Можно ли добавить столбец, который я указываю как NOT NULL, я не хочу указывать значение DEFAULT, но MS-SQL 2005 говорит:

ALTER TABLE только позволяет добавлять столбцы, которые могут содержать нули или иметь заданное определение DEFAULT, или добавляемый столбец - это столбец листинга или метки времени, или, если ни одно из предыдущих условий не выполняется, таблица должна быть пустой чтобы добавить этот столбец. Столбец "test" не может быть добавлен в непустую таблицу "shiplist", потому что он не удовлетворяет этим условиям.

Если ДА, дайте мне знать синтаксис, если нет, укажите причину.

4b9b3361

Ответ 1

Нет, вы не можете.

Потому что, если бы вы могли, SQL не знал бы, что поставить в качестве значения в уже существующие записи. Если у вас нет записей в таблице, это будет работать без проблем.

Самый простой способ сделать это - создать столбец со значением по умолчанию и затем удалить значение по умолчанию.

ALTER TABLE dbo.MyTable ADD
MyColumn text NOT NULL CONSTRAINT DF_MyTable_MyColumn DEFAULT 'defaultValue'
ALTER TABLE dbo.MyTable
DROP CONSTRAINT DF_MyTable_MyColumn

Другой альтернативой было бы добавить столбец без ограничения, заполнить значения для всех ячеек и добавить ограничение.

Ответ 2

Добавьте столбец в таблицу, обновите существующие строки, чтобы ни один из них не был пустым, а затем добавьте ограничение "не null".

Ответ 3

Нет. SQL Server вполне обоснованно отвергает это, поскольку он не знает, какое значение должны иметь существующие строки

Легко создать DEFAULT одновременно, а затем сразу же отбросить его.

Ответ 4

Нет, вы не можете. Но вы можете рассмотреть, чтобы указать значение по умолчанию ('')

Ответ 5

Нет.

Просто используйте пустую строку '' (в случае символьного типа) или 0 (если числовое) и т.д. как значение DEFAULT

Ответ 6

Нет, вы не можете, поскольку SQL Server или любые другие механизмы базы данных заставят этот новый столбец быть нулевым для существующих строк в вашей таблице данных. Но поскольку вы не разрешаете NULL, вам необходимо предоставить значение по умолчанию, чтобы уважать ваше собственное ограничение. Это подпадает под большой смысл! DBE не будет экстраполировать значение для ненулевых значений для существующих строк.

Ответ 7

@Комментарий Damien_The_Unbeliever, Является ли он добавлением вычисленного столбца? Ни вопрос, ни ответ не подразумевали ничего подобного. В случае вычисленного столбца ошибка:

"В расчетных столбцах могут быть созданы только ограничения UNIQUE или PRIMARY KEY, в то время как ограничения CHECK, FOREIGN KEY и NOT NULL требуют, чтобы вычисленные столбцы сохранялись"

ОК, если продолжить эту игру угадывания, вот мой script, иллюстрирующий добавление столбца "NOT NULL" в один шаг "ALTER TABLE":

CREATE TABLE TestInsertComputedColumn 
(
    FirstName VARCHAR(100),
    LastName CHAR(50)
);  

insert into TestInsertComputedColumn(FirstName,LastName)
     select 'v', 'gv8';
select * from TestInsertComputedColumn;

ALTER TABLE TestInsertComputedColumn 
      ADD FullName As FirstName + LastName PERSISTED NOT NULL;

select * from TestInsertComputedColumn;
--drop TABLE TestInsertComputedColumn;

Ответ 8

Я использую этот подход для вставки столбца NOT NULL без значения по умолчанию

ALTER TABLE [Table] ADD [Column] INT NULL
GO
UPDATE [Table] SET [Column] = <default_value>
ALTER TABLE [Table] ALTER COLUMN [Column] INT NOT NULL