Могу ли я добавить ненулевой столбец без значения DEFAULT - PullRequest
59 голосов
/ 22 октября 2010

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

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

Если ДА, сообщите мне синтаксис, если Нет, укажите причину.

Ответы [ 8 ]

79 голосов
/ 22 октября 2010

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

Потому что, если бы вы могли, 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

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

19 голосов
/ 22 октября 2010

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

8 голосов
/ 22 октября 2010

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

Создать DEFAULT одновременно легко, а затем сразубрось.

2 голосов
/ 18 июля 2017

Я использую этот подход для вставки столбца 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
1 голос
/ 24 сентября 2015

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

0 голосов

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

"Для вычисляемых столбцов могут быть созданы только ограничения UNIQUE или PRIMARY KEY, в то время как ограничения CHECK, FOREIGN KEY и 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;
0 голосов
/ 22 октября 2010

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

0 голосов
/ 22 октября 2010

Просто используйте пустую строку '' (в случае типа символов) или 0 (если числовой) и т. Д. В качестве значения ПО УМОЛЧАНИЮ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...