Как добавить столбец со значением по умолчанию в существующую таблицу в SQL Server 2000 / SQL Server 2005?

3038
Mathias 18 Сен 2008 в 16:30
5
Как на этот вопрос 41 ответ? Просматривая его, большинство из них говорят то же самое. Почему они не удаляются? На этот вопрос нужно максимум 3 ответа.
 – 
Michael Z.
16 Май 2021 в 01:00
ALTER TABLE SomeTable ADD SomeCol Bit NULL --ИЛИ НЕ NULL. CONSTRAINT D_SomeTable_SomeCol - при пропуске автоматически создается имя ограничения по умолчанию. ПО УМОЛЧАНИЮ (0) - необязательное ограничение по умолчанию. СО ЗНАЧЕНИЯМИ --Добавьте, если столбец имеет значение NULL и вам нужно значение по умолчанию для существующих записей.
 – 
Ali NajafZadeh
3 Авг 2021 в 20:06
@MichaelZ. - 43 ответа сейчас .....
 – 
Alex
7 Дек 2021 в 15:49

30 ответов

Лучший ответ

Синтаксис:

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.

Примечания:

Имя необязательного ограничения:
Если вы не укажете CONSTRAINT D_SomeTable_SomeCol, SQL Server сгенерирует автоматически
Контракт по умолчанию с забавным названием, например: DF__SomeTa__SomeC__4FB7FEF6

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

Как вставки работают с ограничением по умолчанию:
Если вы вставляете запись в SomeTable и не указываете значение SomeCol, то по умолчанию будет использоваться 0. < br /> Если вы вставляете запись и , укажите значение SomeCol как NULL (и ваш столбец допускает нули),
тогда ограничение по умолчанию будет не использоваться, а NULL будет вставлен в качестве значения.

Примечания основаны на замечательных отзывах всех, представленных ниже.
Особая благодарность:
@Yatrix, @WalterStabosz, @YahooSerious и @StackMan за их комментарии.

3846
MikeTeeVee 3 Июл 2018 в 23:44
351
Имейте в виду, что если столбец допускает значение NULL, то значение NULL будет использоваться для существующих строк.
 – 
Richard Collette
31 Янв 2012 в 19:43
20
Столбец, допускающий значение NULL, означает, что вы можете вставить значение Null в качестве значения столбца. Если это не столбец, допускающий значение NULL, вам необходимо вставить какое-то значение этого типа данных. Таким образом, для существующих записей в них будет вставлен Null, а в новые записи будет вставлено ваше значение по умолчанию, если не указано иное. Есть смысл?
 – 
Yatrix
29 Фев 2012 в 20:42
44
Мне этот ответ нравится немного больше, чем ответ dbugger, потому что он явно называет ограничение по умолчанию. Ограничение по умолчанию по-прежнему создается с использованием синтаксиса dbugger, за исключением того, что его имя генерируется автоматически. Знать точное имя удобно при написании скриптов DROP-CREATE.
 – 
Walter Stabosz
23 Мар 2012 в 16:43
51
Используйте WITH VALUES для обновления существующих строк, допускающих значение NULL. См. MSDN: "Если добавленный столбец допускает нулевые значения и WITH VALUES, значение по умолчанию сохраняется в новом столбце и добавляется к существующим строкам ".
 – 
Yahoo Serious
28 Июл 2014 в 13:45
Когда он заполняет значение по умолчанию, запускает ли он триггеры обновления и / или блокирует таблицы? Если да, то можно ли их избежать?
 – 
xr280xr
3 Дек 2021 в 02:01
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO

Включение DEFAULT заполняет столбец в существующих строках значением по умолчанию, поэтому ограничение NOT NULL не нарушается.

1107
dbugger 19 Апр 2016 в 16:35
92
Просто чтобы уточнить - если в команде опущено "NOT NULL", значение для существующих строк НЕ будет обновлено и останется NULL. Если в команду включено «NOT NULL», значение для существующих строк БУДЕТ обновлено, чтобы соответствовать значениям по умолчанию.
 – 
Stack Man
15 Авг 2012 в 02:11

При добавлении столбца, допускающего значение NULL , WITH VALUES гарантирует, что конкретное значение DEFAULT применяется к существующим строкам:

ALTER TABLE table
ADD column BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
265
Peter Mortensen 26 Май 2017 в 22:11
ALTER TABLE <table name> 
ADD <new column name> <data type> NOT NULL
GO
ALTER TABLE <table name> 
ADD CONSTRAINT <constraint name> DEFAULT <default value> FOR <new column name>
GO
153
John Saunders 31 Июл 2009 в 07:46
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'
138
Darren Griffith 17 Ноя 2012 в 03:33

Самая простая версия только с двумя строками

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0
111
adeel41 25 Май 2012 в 18:50

Будьте осторожны, если столбец, который вы добавляете, имеет ограничение NOT NULL, но не имеет ограничения (значения) DEFAULT. Оператор ALTER TABLE завершится ошибкой в ​​том случае, если в таблице есть какие-либо строки. Решение состоит в том, чтобы либо удалить ограничение NOT NULL из нового столбца, либо предоставить для него ограничение DEFAULT.

104
jalbert 24 Сен 2008 в 20:03

Использование:

-- Add a column with a default DateTime  
-- to capture when each record is added.

ALTER TABLE myTableName  
ADD RecordAddedDate SMALLDATETIME NULL DEFAULT (GETDATE())  
GO 
93
Sheriff 27 Фев 2020 в 11:53

Если вы хотите добавить несколько столбцов, вы можете сделать это, например:

ALTER TABLE YourTable
    ADD Column1 INT NOT NULL DEFAULT 0,
        Column2 INT NOT NULL DEFAULT 1,
        Column3 VARCHAR(50) DEFAULT 'Hello'
GO
89
Gabriel L. 14 Ноя 2017 в 23:54

Использование:

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

Ссылка: ALTER TABLE (Transact-SQL) (MSDN)

60
Peter Mortensen 26 Май 2017 в 22:18

Чтобы добавить столбец в существующую таблицу базы данных со значением по умолчанию, мы можем использовать:

ALTER TABLE [dbo.table_name]
    ADD [Column_Name] BIT NOT NULL
Default ( 0 )

Вот еще один способ добавить столбец в существующую таблицу базы данных со значением по умолчанию.

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

-------------------------------------------------------------------------
-- Drop COLUMN
-- Name of Column: Column_EmployeeName
-- Name of Table: table_Emplyee
--------------------------------------------------------------------------
IF EXISTS (
            SELECT 1
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_NAME = 'table_Emplyee'
              AND COLUMN_NAME = 'Column_EmployeeName'
           )
    BEGIN

        IF EXISTS ( SELECT 1
                    FROM sys.default_constraints
                    WHERE object_id = OBJECT_ID('[dbo].[DF_table_Emplyee_Column_EmployeeName]')
                      AND parent_object_id = OBJECT_ID('[dbo].[table_Emplyee]')
                  )
            BEGIN
                ------  DROP Contraint

                ALTER TABLE [dbo].[table_Emplyee] DROP CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]
            PRINT '[DF_table_Emplyee_Column_EmployeeName] was dropped'
            END
     --    -----   DROP Column   -----------------------------------------------------------------
        ALTER TABLE [dbo].table_Emplyee
            DROP COLUMN Column_EmployeeName
        PRINT 'Column Column_EmployeeName in images table was dropped'
    END

--------------------------------------------------------------------------
-- ADD  COLUMN Column_EmployeeName IN table_Emplyee table
--------------------------------------------------------------------------
IF NOT EXISTS (
                SELECT 1
                FROM INFORMATION_SCHEMA.COLUMNS
                WHERE TABLE_NAME = 'table_Emplyee'
                  AND COLUMN_NAME = 'Column_EmployeeName'
               )
    BEGIN
    ----- ADD Column & Contraint
        ALTER TABLE dbo.table_Emplyee
            ADD Column_EmployeeName BIT   NOT NULL
            CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]  DEFAULT (0)
        PRINT 'Column [DF_table_Emplyee_Column_EmployeeName] in table_Emplyee table was Added'
        PRINT 'Contraint [DF_table_Emplyee_Column_EmployeeName] was Added'
     END

GO

Это два способа добавить столбец в существующую таблицу базы данных со значением по умолчанию.

60
Catto 29 Ноя 2017 в 22:13

Вы можете сделать это с помощью T-SQL следующим образом.

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

Вы также можете использовать SQL Server Management Studio, щелкнув правой кнопкой мыши таблицу в меню «Дизайн», установив значение по умолчанию для таблицы.

И, кроме того, если вы хотите добавить один и тот же столбец (если он не существует) во все таблицы в базе данных, используйте:

 USE AdventureWorks;
 EXEC sp_msforeachtable
'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;
56
Peter Mortensen 26 Май 2017 в 22:15

В SQL Server 2008-R2 я перехожу в режим разработки - в тестовой базе данных - и добавляю два столбца с помощью конструктора и выполняю настройки с помощью графического интерфейса, а затем печально известный щелчок правой кнопкой мыши дает опция « Создать сценарий изменения »!

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

55
Peter Mortensen 26 Май 2017 в 22:17

В качестве альтернативы вы можете добавить значение по умолчанию без явного указания ограничения:

ALTER TABLE [schema].[tablename] ADD  DEFAULT ((0)) FOR [columnname]

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

alter table [schema].[tablename] drop constraint [constraintname]
53
Peter Mortensen 26 Май 2017 в 22:19

Это также можно сделать в графическом интерфейсе SSMS. Я показываю дату по умолчанию ниже, но значение по умолчанию, конечно, может быть любым.

  1. Поместите свою таблицу в представление дизайна (щелкните правой кнопкой мыши таблицу в проводнике объектов-> Дизайн)
  2. Добавьте столбец в таблицу (или щелкните столбец, который вы хотите обновить, если он уже существует)
  3. В свойствах столбца ниже введите (getdate()) или 'abc' или 0 или любое другое значение, которое вы хотите, в поле Значение по умолчанию или Привязка , как показано ниже:

enter image description here

49
Tony L. 24 Июн 2020 в 20:20
Эта функция не работает в версии SSMS 18.1. Я сделал это на nvarchar, ввел 'vision' в значение по умолчанию или Bindung, сохранил, но не вставил мою строку в новые сущности. Я вернулся к диалогу и обнаружил, что запись в поле изменена на ('видение')
 – 
d00d
25 Ноя 2021 в 16:22
ALTER TABLE ADD ColumnName {Column_Type} Constraint

Статья MSDN ALTER TABLE (Transact-SQL) имеет весь синтаксис alter table.

45
Peter Mortensen 30 Июл 2013 в 01:11

Примере:

ALTER TABLE [Employees] ADD Seniority int not null default 0 GO
36
Peter Mortensen 12 Июл 2014 в 10:39

Примере:

ALTER TABLE tes 
ADD ssd  NUMBER   DEFAULT '0';
25
shA.t 15 Апр 2015 в 08:13

Сначала создайте таблицу с именем ученика:

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

Добавьте к нему один столбец:

ALTER TABLE STUDENT 
ADD STUDENT_NAME INT NOT NULL DEFAULT(0)

SELECT * 
FROM STUDENT

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

Image 1

24
Sankar 29 Май 2017 в 11:28

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

ALTER TABLE {schemaName}.{tableName}
    ADD {columnName} {datatype} NULL
    CONSTRAINT {constraintName} DEFAULT {DefaultValue}

UPDATE {schemaName}.{tableName}
    SET {columnName} = {DefaultValue}
    WHERE {columName} IS NULL

ALTER TABLE {schemaName}.{tableName}
    ALTER COLUMN {columnName} {datatype} NOT NULL

Что это будет делать, так это добавить столбец как поле, допускающее значение NULL, и со значением по умолчанию, обновить все поля до значения по умолчанию (или вы можете назначить более значимые значения), и, наконец, он изменит столбец на NOT NULL.

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

Этот метод добавит столбец, допускающий значение NULL, который работает намного быстрее сам по себе, а затем заполнит данные перед установкой состояния not NULL.

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

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

WHILE 1=1
BEGIN
    UPDATE TOP (1000000) {schemaName}.{tableName}
        SET {columnName} = {DefaultValue}
        WHERE {columName} IS NULL

    IF @@ROWCOUNT < 1000000
        BREAK;
END
22
Peter Mortensen 26 Май 2017 в 22:29

Попробуй это

ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
21
Jakir Hossain 1 Сен 2014 в 11:17

SQL Server + Изменить таблицу + Добавить столбец + Уникальный идентификатор значения по умолчанию

ALTER TABLE Product 
ADD ReferenceID uniqueidentifier not null 
default (cast(cast(0 as binary) as uniqueidentifier))
20
Vivek S. 7 Июл 2015 в 11:38
IF NOT EXISTS (
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME ='TABLENAME' AND COLUMN_NAME = 'COLUMNNAME'
)
BEGIN
    ALTER TABLE TABLENAME ADD COLUMNNAME Nvarchar(MAX) Not Null default
END
20
Bharath theorare 21 Июн 2016 в 14:29
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
20
wild coder 27 Мар 2018 в 10:38

Это для SQL Server:

ALTER TABLE TableName
ADD ColumnName (type) -- NULL OR NOT NULL
DEFAULT (default value)
WITH VALUES

Примере:

ALTER TABLE Activities
ADD status int NOT NULL DEFAULT (0)
WITH VALUES

Если вы хотите добавить ограничения, то:

ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES
19
Prashant Pimpale 30 Сен 2018 в 18:31

Добавьте в таблицу новый столбец:

ALTER TABLE [table]
ADD Column1 Datatype

Например,

ALTER TABLE [test]
ADD ID Int

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

ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL
16
Peter Mortensen 26 Май 2017 в 22:21

Это можно сделать с помощью приведенного ниже кода.

CREATE TABLE TestTable
    (FirstCol INT NOT NULL)
    GO
    ------------------------------
    -- Option 1
    ------------------------------
    -- Adding New Column
    ALTER TABLE TestTable
    ADD SecondCol INT
    GO
    -- Updating it with Default
    UPDATE TestTable
    SET SecondCol = 0
    GO
    -- Alter
    ALTER TABLE TestTable
    ALTER COLUMN SecondCol INT NOT NULL
    GO
12
Peter Mortensen 26 Май 2017 в 22:23

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

ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue

Это добавит новый столбец в таблицу.

12
Prashant Pimpale 30 Сен 2018 в 18:32
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)

Из этого запроса вы можете добавить столбец целочисленного типа данных со значением по умолчанию 0.

10
Sandeep Kumar 24 Май 2016 в 14:20

Что ж, теперь у меня есть некоторые изменения в моем предыдущем ответе. Я заметил, что ни в одном из ответов не упоминается IF NOT EXISTS. Итак, я собираюсь предложить новое решение, так как я столкнулся с некоторыми проблемами при изменении таблицы.

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = 'TaskSheet' AND column_name = 'IsBilledToClient')
BEGIN
ALTER TABLE dbo.TaskSheet ADD
 IsBilledToClient bit NOT NULL DEFAULT ((1))
END
GO

Здесь TaskSheet - это конкретное имя таблицы, а IsBilledToClient - это новый столбец, который вы собираетесь вставить, и 1 значение по умолчанию. Это означает, что в новом столбце будет значение существующих строк, поэтому оно будет установлено автоматически. Однако вы можете изменить тип столбца по своему усмотрению, как я использовал BIT, поэтому я установил значение по умолчанию 1.

Я предлагаю описанную выше систему, потому что столкнулся с проблемой. Так в чем проблема? Проблема в том, что если столбец IsBilledToClient действительно существует в таблице таблицы, то, если вы выполните только часть кода, приведенного ниже, вы увидите ошибку в построителе запросов SQL-сервера. Но если его нет, то в первый раз при выполнении не будет ошибки.

ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
[WITH VALUES]
10
Peter Mortensen 26 Май 2017 в 22:26