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


375

Это не работает в SQL Server 2008:

ALTER TABLE Employee ALTER COLUMN CityBorn SET DEFAULT 'SANDNES'

Ошибка:

Неверный синтаксис рядом с ключевым словом «SET».

Что я делаю неправильно?


1
Что вы читали в MSDN ALTER TABLE ...? msdn.microsoft.com/en-us/library/ms187742(SQL.90).aspx
gbn

2


1
Это синтаксис MySQL.
Бенджамин Гудэйкр

почему не все могут придерживаться стандарта? (не реальный вопрос, все ссылаются на Microsoft и MySQL или других поставщиков). Есть ли даже ANSI / ISO стандартный способ сделать это?
joedotnot

Ответы:


566

Это будет работать в SQL Server:

ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;

62
+1 для указания имени ограничения, поэтому SQL Server не создает случайное имя.
HardCode

36
MSSQL странно для вызова значений по умолчанию "ограничений". Во всяком случае, они расслабления ; противоположность из ограничений! Они делают больше вещей действительными, а не меньше.
Роман Старков

4
Это не странно, если вы думаете по-другому: ограничение по умолчанию не позволяет MSSQL выдавать ошибку, если вы не укажете столбец. Таким образом, это не ограничение для пользователя, а ограничение для MSSQL.
Джонни Пьяцци

4
Это работает только в том случае, если для столбца нет ограничения по умолчанию.
pmcilreavy

4
@fallenidol Это работает только в том случае, если для столбца нет ограничения по умолчанию. Правильно, потому что по определению вы не можете иметь более одного значения по умолчанию ...
Yuck

165
ALTER TABLE Employee ADD DEFAULT 'SANDNES' FOR CityBorn

3
Это работает в MSSQL, но у него есть недостаток, заключающийся в том, что он не называет ограничение, которое создает за кулисами (см. Ответ с более высоким рейтингом выше).
Contango

10
@Contango Я думаю, что лучше не называть каждое ограничение на шанс, которое вам нужно, чтобы изменить одно из них. Просто напишите процедуру удаления автоматически названных ограничений, и вам больше никогда не придется их называть + можно справиться со всеми остальными безымянными
JonnyRaa

3
@ Джонни Лидс. Хорошая точка зрения. Мне также нравится называть ограничения, поскольку это хорошая документация для всех, кто пытается изменить (или просто понять) схему базы данных. Это менее важно, если вы работаете в одиночной команде.
Контанго

1
(EESH! Извините за отсутствие перевода строки - вставлено ниже для ясности!) Мне нужно было повторно запустить его и нашел этот способ, чтобы проверить, было ли это уже сделано ... ЕСЛИ СУЩЕСТВУЕТ (ВЫБРАТЬ * ИЗ ИМЕНИ_schema.columns ГДЕ table_name = 'myTable' AND column_name = 'myColumn' AND Table_schema = 'myDBO' и column_default IS NULL) НАЧАТЬ ALTER TABLE [myDBO]. [myTable] ДОБАВИТЬ ПО УМОЛЧАНИЮ 0 ДЛЯ [myColumn] END
Дейв

4
Если есть только одно ограничение по умолчанию ... почему вы должны назвать его? Похоже, что другие движки баз данных предоставляют синтаксис для добавления, обновления, удаления значения по умолчанию для столбца без имени, кроме имени столбца, что имеет смысл. Приведенный выше код не выполняется, кстати, если значение по умолчанию уже существует. Смешно, что SQL Server требует сложного соединения с системной таблицей только для того, чтобы идентифицировать имя ограничения по умолчанию, которое не должно быть необходимым, поскольку для столбца может быть только одно ограничение по умолчанию.
Трийнко

51

для этого нельзя использовать alter column, используйте вместо этого add

ALTER TABLE Employee 
ADD DEFAULT('SANDNES') FOR CityBorn

9
не знаю, почему этот ответ не получает голосов. Это точно так же, как и раньше, и ему ответили ранее ...
spankmaster79

29

Правильный способ сделать это заключается в следующем:

  1. Запустите команду:

    sp_help [table name] 
  2. Скопируйте имя CONSTRAINT.

  3. Оставьте DEFAULT CONSTRAINT:

    ALTER TABLE [table name] DROP [NAME OF CONSTRAINT] 
  4. Запустите команду ниже:

    ALTER TABLE [table name] ADD DEFAULT [DEFAULT VALUE] FOR [NAME OF COLUMN]

4
StackOverflow.com только на английском языке. Португальский сайт pt.stackoverflow.com
Мартин Смит

Это не добавляет ничего нового к другим ответам, является ручным методом - не может быть написано в сценарии, и в нем говорится, что «правильный путь» ..
Andre Figueiredo

12

Решение Hoodaticus было идеальным, спасибо, но я также нуждался в том, чтобы его можно было повторно запустить, и нашел способ проверить, было ли это сделано ...

IF EXISTS(SELECT * FROM information_schema.columns 
           WHERE table_name='myTable' AND column_name='myColumn' 
             AND Table_schema='myDBO' AND column_default IS NULL) 
BEGIN 
  ALTER TABLE [myDBO].[myTable] ADD DEFAULT 0 FOR [myColumn] --Hoodaticus
END

7

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

  1. Во время создания таблицы
  2. Изменить существующий столбец для существующей таблицы.

  1. Во время создания таблицы / создания нового столбца.

запрос

create table table_name
(
    column_name datatype default 'any default value'
);
  1. Изменить существующий столбец для существующей таблицы

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

Выполните несколько шагов:

  1. Перечислите все существующие ограничения по умолчанию для столбцов.

Выполните эту процедуру базы данных системы, она принимает имя таблицы в качестве параметра. Возвращает список всех ограничений для всех столбцов в таблице.

execute [dbo].[sp_helpconstraint] 'table_name'
  1. Удалить существующее ограничение по умолчанию для столбца.

Синтаксис:

alter table 'table_name' drop constraint 'constraint_name'
  1. Добавьте новое ограничение по умолчанию для этого столбца:

Синтаксис:

alter table 'table_name' add default 'default_value' for 'column_name'

ура @ !!!


5

если ограничение уже существует с именем по умолчанию:

-- Drop existing default constraint on Employee.CityBorn
DECLARE @default_name varchar(256);
SELECT @default_name = [name] FROM sys.default_constraints WHERE parent_object_id=OBJECT_ID('Employee') AND COL_NAME(parent_object_id, parent_column_id)='CityBorn';
EXEC('ALTER TABLE Employee DROP CONSTRAINT ' + @default_name);

-- Add default constraint on Employee.CityBorn
ALTER TABLE Employee ADD CONSTRAINT df_employee_1 DEFAULT 'SANDNES' FOR CityBorn;


4

Вы можете использовать следующий синтаксис. Для получения дополнительной информации см. Этот вопрос и ответы: Добавьте столбец со значением по умолчанию к существующей таблице в SQL Server.

Синтаксис:

ALTER TABLE {TABLENAME} 
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} 
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES

Пример :

ALTER TABLE SomeTable
ADD SomeCol Bit NULL --Or NOT NULL.
CONSTRAINT D_SomeTable_SomeCol --When Omitted a Default-Constraint Name is 
autogenerated.
DEFAULT (0)--Optional Default-Constraint.
WITH VALUES --Add if Column is Nullable and you want the Default Value for Existing Records.

Другой путь :

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

Затем в нижней части страницы добавьте значение по умолчанию или привязку: что-то вроде '1' для строки или 1 для int.


3

Только что нашел 3 простых шага, чтобы изменить уже существующий столбец, который был нулевым раньше

update   orders
set BasicHours=0 where BasicHours is null

alter table orders 
add default(0) for BasicHours

alter table orders 
alter  column CleanBasicHours decimal(7,2) not null 

3

Ограничения первой капли

https://stackoverflow.com/a/49393045/2547164

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)

Второй создать значение по умолчанию

ALTER TABLE [table name] ADD DEFAULT [default value] FOR [column name]


1

Например, ответ Юка с проверкой, позволяющей запускать сценарий более одного раза без ошибок. (меньше кода / пользовательских строк, чем при использовании information_schema.columns)

IF object_id('DF_SomeName', 'D') IS NULL BEGIN
    Print 'Creating Constraint DF_SomeName'
   ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;
END
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.