Как добавить ограничение NOT NULL вместе со значением по умолчанию для столбца?

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть столбец ‘name’ в таблице student. Мне нужно добавить ограничение NOT NULL для этого столбца. Но я получаю сообщение об ошибке SQL, в котором говорится, что невозможно добавить ограничение null, поскольку существующие строки в таблице имеют нулевые значения в столбце. Как бы я добавил ограничение null вместе со значением по умолчанию в одном операторе alter. Ниже приведен мой запрос.

 alter table Student alter column name nvarchar NOT NULL;
  

Комментарии:

1. Сначала вы должны обновить существующие строки. Но вы можете добавить свое ограничение без ПРОВЕРКИ , которая не проверяет существующие данные.

Ответ №1:

SQL Server не упрощает это. Я думаю, что единственный способ — установить для существующих значений значение по умолчанию, которое вы хотите. Затем измените столбец на значение по умолчанию и not null :

 -- Get rid of the existing `NULL` values
update students set name = '' where name is null;

-- Add the NOT NULL constraint
alter table students
    alter column name varchar(255) not null;

-- Add a default value
alter table students
    add constraint df_t_name default '' for name ;
  

Вот как это выглядит на практике.

Ответ №2:

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

Вы пробовали перезаписывать существующие значения NULL?

У вас не может быть ограничения на столбец, если существующие значения будут нарушать это ограничение. Сначала вам нужно сделать вашу таблицу совместимой.

Комментарии:

1. Итак, нет ли способа добавить значения по умолчанию в существующие столбцы и добавить NOT NULL в одном запросе ALTER

2. @swetha Нет. Цель ограничения — гарантировать , что в столбце не может быть значений, нарушающих данное правило. Если бы существовал способ добавить ограничение при наличии нарушающих значений, ограничения были бы бесполезны.

3. Обычно я делаю что-то подобное (1) UPDATE tbl SET col = 0 WHERE col IS NULL , (2) ALTER TABLE tbl ALTER COLUMN col int NOT NULL , (3) ALTER TABLE tbl ADD CONSTRAINT df_tbl_col DEFAULT(0) FOR col

4. @swetha — нет, потому что значение по умолчанию учитывается только во время операции вставки. Оно не применяется ретроспективно к столбцам, которые были вставлены с нулевыми значениями (действительно, допустимо иметь столбец со значением по умолчанию, который также допускает нули и имеет некоторые)