Как вы удаляете значение по умолчанию из столбца в таблице?

Как изменить столбец, чтобы удалить значение по умолчанию?

Столбец был создан с помощью:

 ALTER table sometable Add somecolumn nchar(1) NOT NULL DEFAULT 'N'

И затем изменено с:

 alter table sometable alter column somecolumn nchar(1) null

Это позволяет пустые значения, но значение по умолчанию остается. Как вы можете удалить это?

6 ответов

Решение

Это ограничение по умолчанию, вам нужно выполнить:

ALTER TABLE {TableName} 
DROP CONSTRAINT ConstraintName

Если вы не указали имя при создании ограничения, то SQL Server создал его для вас. Вы можете использовать SQL Server Management Studio для поиска имени ограничения, перейдя к таблице, открыв ее узел дерева, а затем открыв узел Ограничения.

Если я правильно помню, ограничение будет называться как-то по DF_SomeStuff_ColumnName.

РЕДАКТИРОВАТЬ: Ответ Джоша В. содержит ссылку на SO вопрос, который показывает вам, как найти автоматически сгенерированное имя ограничения с использованием SQL вместо интерфейса Management Studio.

Если вы не знаете ограничения имени

DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS
WHERE PARENT_OBJECT_ID = OBJECT_ID('__TableName__')
AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns
                        WHERE NAME = N'__ColumnName__'
                        AND object_id = OBJECT_ID(N'__TableName__'))
IF @ConstraintName IS NOT NULL
EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)

/questions/36089950/kak-udalit-stolbets-s-ogranicheniem/36089970#36089970

Это то, что я придумал (прежде чем увидеть ответ Джоша У., ну, на самом деле, я видел это, но просмотрел его так быстро, что я неправильно понял):

declare @name nvarchar(100)
select @name = [name] from sys.objects where type = 'D' and parent_object_id = object_id('sometable')

if (@name is not null)
  begin
     exec ('alter table [sometable] drop constraint [' + @name +']')
  end

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

(Проблема в том, что это изменение, внесенное в 10 различных клиентских баз данных, поэтому в сценарии нет единого согласованного имени)

select name from sys.default_constraints where name like '%first_3_chars_of_field_name%'

Найдите свое ограничение и используйте DROP CONSTRAINT бросить это. Или запустите курсор / цикл while, чтобы сбросить все похожие значения по умолчанию в базе данных.

Если вы используете SQL Server Management Studio, это довольно просто.

Если с таблицей связано несколько ограничений, и вы не хотите удалять их все, щелкните правой кнопкой мыши ограничение и выберите "Script Cnstraint as -> CREATE to -> New Query Editor Window". Это покажет вам код, который создал ограничение, включая имя столбца и значение по умолчанию.

Затем просто щелкните правой кнопкой мыши на ограничении, которое вы хотите удалить, и выберите Удалить.

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

Я наконец решил это, щелкнув правой кнопкой мыши имя таблицы в SQL Management Studio и выбрав Дизайн. Затем я удалил значения по умолчанию в свойствах столбца.

alter table <tablename> drop constraint <constraintname>

если вы не знаете имя ограничения, вы можете использовать sql server manangement studio для проверки имени ограничения.... надеюсь, это поможет.

Другие вопросы по тегам