#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 — нет, потому что значение по умолчанию учитывается только во время операции вставки. Оно не применяется ретроспективно к столбцам, которые были вставлены с нулевыми значениями (действительно, допустимо иметь столбец со значением по умолчанию, который также допускает нули и имеет некоторые)