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

Изменить значение по умолчанию в SQL Server

Я пытаюсь изменить значение по умолчанию для столбца, используя инструкцию SQL в SQL Server 2008. Во многих местах я обнаружил, как установить значение по умолчанию при создании таблицы/добавить столбец, но не как установите его/измените, как только столбец уже существует.

Это то, что я могу использовать, чтобы установить его при добавлении:

ALTER TABLE MyTable ADD MyColumn int NOT NULL DEFAULT 0

И это работает, но если я попытаюсь изменить его позже:

ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL DEFAULT -1
ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL SET DEFAULT -1

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

Есть ли способ сделать то, что я хочу, в одном простом предложении?

Спасибо.

4b9b3361

Ответ 1

Когда вы добавляете столбец со значением по умолчанию, происходит следующее: создается ограничение по умолчанию:

create table _temp 
( x int default 1)

sp_help результат:

constraint_type constraint_name
DEFAULT on column x DF___temp__x__5A3B20F9

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

alter table _temp drop constraint DF___temp__x__5A3B20F9 

А затем создайте новое ограничение по умолчанию:

alter table _temp add constraint DF_temp_x default 2 for x

Ответ 2

DECLARE @Command nvarchar(max), @ConstraintName nvarchar(max), @TableName nvarchar(max), @ColumnName nvarchar(max)
SET @TableName = 'TableName'
SET @ColumnName = 'ColumnName'
SELECT @ConstraintName = name
    FROM sys.default_constraints
    WHERE parent_object_id = object_id(@TableName)
        AND parent_column_id = columnproperty(object_id(@TableName), @ColumnName, 'ColumnId')

SELECT @Command = 'ALTER TABLE ' + @TableName + ' DROP CONSTRAINT ' + @ConstraintName  
EXECUTE sp_executeSQL @Command

SELECT @Command = 'ALTER TABLE ' + @TableName + ' ADD CONSTRAINT ' + @ConstraintName + ' DEFAULT 1 FOR ' + @ColumnName 
EXECUTE sp_executeSQL @Command

Ответ 3

Вы должны удалить ограничение DEFAULT и добавить новый, подобный этому

alter table Mytable
drop constraint <constraint name>
go
alter table MyTable
add constraint df_MyTable_MyColumn default -1 for MyColumn
go

Используйте sp_helpconstraint MyTable, чтобы получить имена ограничений

Ответ 4

DEFAULT является ограничением. Вы хотите использовать ALTER TABLE ADD CONSTRAINT.

ALTER TABLE MyTable
ADD CONSTRAINT <constraint name>
DEFAULT -1 FOR MyColumn

Сначала вам нужно сбросить текущее ограничение, например:

ALTER TABLE MyTable
DROP CONSTRAINT <constraint name>

Ответ 5

Добавить значение по умолчанию для столбца, если оно не существует

DECLARE @defaultLock VARCHAR(100)
SELECT @defaultLock = (SELECT object_definition(default_object_id) AS definition FROM sys.columns WHERE name = 'Lock' AND object_id = object_id('dbo.Positions'))
    IF @defaultLock IS NULL
        ALTER TABLE Positions ADD DEFAULT (0) FOR Lock

Ответ 6

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

select 'USE ' + DB_NAME()
SELECT 'ALTER TABLE '+ src3.name + '.' + src1.name +' drop constraint '+ src.name + '
ALTER TABLE ' + src3.name + '.' +  src1.name +' ADD CONSTRAINT '+ src.name + ' DEFAULT getutcdate() FOR ' + src2.name -- amend default constrint accordingly.
    FROM sys.tables src1
      inner join sys.schemas src3
        on src3.schema_id = src1.schema_id
      inner join sys.columns src2
        on src2.object_id = src1.object_id
      inner join sys.default_constraints src
        on src.parent_column_id = src2.column_id
           and src.parent_object_id = src1.object_id
    WHERE  (-- pick up existing constraint definition
            src.definition like '%getdate%'
             or src.definition like '%current\_timestamp%' escape '\'
            )
            and src1.type = 'U'
order by  src3.name + '.' + src1.name

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