Як встановити значення за замовчуванням для існуючого стовпця


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



1
Це синтаксис mysql.
Бенджамін Годакре

чому кожен не може просто дотримуватися стандарту? (не справжнє запитання, кожен, хто має на увазі microsoft та mysql або інших постачальників). чи існує навіть стандартний спосіб ансі / ізо?
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 Це працює лише в тому випадку, якщо в стовпці не існує обмеження за замовчуванням. Правильно, тому що за визначенням ви не можете мати більше ніж одне значення за замовчуванням ...
Юк,

165
ALTER TABLE Employee ADD DEFAULT 'SANDNES' FOR CityBorn

3
Це працює в MSSQL, але він недоліком є ​​те, що він не називає обмеження, яке воно створює за кадром (див. Вище проголосовану відповідь вище).
Контанго

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

3
@Jonny Leeds Гарна думка. Мені подобається також називати обмеження, оскільки це хороша документація для тих, хто намагається змінити (або просто зрозуміти) схему бази даних. Це менш важливо, якщо один - сольний оператор, який працює в команді одного.
Контанго

1
(EESH! Вибачте за відсутність лінійних каналів - вставлених нижче для ясності!) Мені потрібно було її повторно виконувати, і я знайшов такий спосіб, щоб перевірити, чи це вже було зроблено ... ЯКЩО ВИНАГАЄТЬСЯ (ВИБРАТИ * ВІД ІНФОРМАЦІЙ_cheche.column WHERE table_name = 'MyTable' І column_name = 'MyColumn' І table_schema = 'myDBO' AND COLUMN_DEFAULT IS NULL) ПОЧАТИ ALTER TABLE [myDBO] [MyTable] ADD DEFAULT 0 FOR [MyColumn] END.
Дейв

4
Якщо існує лише одне обмеження за замовчуванням ... чому ви повинні його називати? Схоже, інші двигуни бази даних надають синтаксис для додавання, оновлення, видалення значення за замовчуванням для стовпця без будь-якого імені, крім імені стовпця, що має сенс. Вищевказаний код не працює, btw, якщо за замовчуванням уже існує. Смішно, що SQL Server вимагає складного з'єднання проти системної таблиці просто для визначення імені обмеження за замовчуванням, що не повинно бути необхідним, оскільки у стовпці може бути лише одне обмеження за замовчуванням.
Трайнко

51

не можна використовувати стовпчик «alter» для цього, використовуйте «add»

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

9
не знаю, чому ця відповідь не дає відгуків. Це точно так само, як і раніше, і на нього відповіли раніше ...
spankmaster79

30

Правильний спосіб зробити це наступним чином:

  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]

2

Спробуйте виконати наступну команду;

ALTER TABLE Person11
ADD CONSTRAINT col_1_def
DEFAULT 'This is not NULL' FOR Address

1

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

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.