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


Ответы:


3498

Синтаксис:

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_SomeColSQL Server автоматически сгенерирует
    ограничение по умолчанию с забавным именем, например:DF__SomeTa__SomeC__4FB7FEF6

Дополнительное С-Values Заявление: только необходимо , когда ваша колонка обнуляемая     и вы хотите по умолчанию значения , используемым для существующих записей. Если ваш столбец есть , он будет автоматически использовать значение     по умолчанию для всех существующих записей, независимо от того, указали вы это или нет.
WITH VALUES

NOT NULL
WITH VALUES

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

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


332
Имейте в виду, что если столбец имеет значение NULL, то значение NULL будет использоваться для существующих строк.
Ричард Коллетт

17
@Thecrocodilehunter Столбец Nullable означает, что вы можете вставить Null для значения столбцов. Если это не обнуляемый столбец, вы должны вставить какое-то значение этого типа данных. Таким образом, для существующих записей в них будет вставлено значение Null, а в новые записи будет добавлено значение по умолчанию, если не указано иное. Есть смысл?
Yatrix

41
Мне нравится этот ответ немного лучше, чем dbugger, потому что он явно называет ограничение по умолчанию. Ограничение по умолчанию все еще создается с использованием синтаксиса dbugger, за исключением того, что его имя генерируется автоматически. Знание точного имени удобно при написании скриптов DROP-CREATE.
Вальтер Стабош

18
@Vertigo Это ТОЛЬКО верно, если столбец NOT NULL. Пожалуйста, попробуйте это: create table blah(a int not null primary key clustered); insert blah values (1), (2); alter table blah add b int null constraint df_blah_b default (0); select * from blah;вы увидите 2 пустых значения для столбца b.
ErikE

48
Используйте WITH VALUESдля обновления существующих обнуляемых строк. См. MSDN : «Если добавленный столбец допускает нулевые значения и WITH VALUESуказан, значение по умолчанию сохраняется в новом столбце, добавляется в существующие строки».
Yahoo Serious

1008
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO

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


13
Проблема с этим ответом состоит в том, что значение по умолчанию действительно только для новых записей. Существующие записи будут по-прежнему иметь значение NULL.
Роуи Гавирель

130
Вы обнаружите, что это не так. В противном случае ограничение будет нарушено.
dbugger

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

80
Просто для пояснения - если в команде не указано «NOT NULL», значение для существующих строк НЕ будет обновлено и останется NULL. Если в команду включено «NOT NULL», значение для существующих строк будет обновлено в соответствии со значением по умолчанию.
стек человек

15
Для нескольких столбцов ALTER TABLE table_1 ADD col_1 int NOT NULL ПО УМОЛЧАНИЮ (1), col_2 int NULL
aads

233

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

ALTER TABLE table
ADD column BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES

13
Это ключевой момент. Легко предположить, что столбец с DEFAULTограничением всегда будет иметь значение, то есть не будет NULL, даже если NOT NULLон не указан.
Билл Бринкли

6
@ tkocmathla О, я не говорил о типе BITданных, я говорил об этой конкретной BIT колонке . Посмотрите на ответ, столбец объявлен как NOT NULL.
rsenna

136
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

7
Это не будет работать, если в таблице уже есть содержимое, потому что новый столбец «не обнуляемый» создается до ограничения по умолчанию
WDuffy

129
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'

13
это добавление null! должно быть не null раньше
baaroz

5
@baaroz, это работает с NOT NULL: ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR (200) NOT NULL ПО УМОЛЧАНИЮ 'SNUGGLES'
shaijut

100

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


2
любой пример SQL об этом?
Kiquenet

98

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

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0

81

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

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

ALTER TABLE myTableName  
ADD RecordAddedDate SMALLDATETIME NULL DEFAULT (GETDATE())  
GO 

79

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

ALTER TABLE YourTable
    ADD Column1 INT NOT NULL DEFAULT 0,
        Column2 INT NOT NULL DEFAULT 1,
        Column3 VARCHAR(50) DEFAULT 'Hello'
GO


54

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

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

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


52

Вы можете сделать это с 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();''' ;

50

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

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


48

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

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

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

alter table [schema].[tablename] drop constraint [constraintname]

1
К вашему сведению, явное именование ограничения с использованием стандартной схемы именования (например, «DF_Table_Column»), для простоты обслуживания. В противном случае поиск ограничения требует больше работы.
Майк Кристиан

43

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

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

введите описание изображения здесь





22

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

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

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

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

SELECT * 
FROM STUDENT

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

Изображение 1


19

На это есть много ответов, но я чувствую необходимость добавить этот расширенный метод. Это кажется намного дольше, но это чрезвычайно полезно, если вы добавляете поле 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

Для этого нужно добавить столбец как пустое поле со значением по умолчанию, обновить все поля до значения по умолчанию (или вы можете назначить более значимые значения), и, наконец, столбец будет иметь значение 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


18

SQL Server + Изменить таблицу + Добавить столбец + Значение по умолчанию uniqueidentifier

ALTER TABLE Product 
ADD ReferenceID uniqueidentifier not null 
default (cast(cast(0 as binary) as uniqueidentifier))

18
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

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

17
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO

Может быть, заменить изображение с реальным кодом? Трудно скопировать и вставить как есть.
Дэвид Фабер

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

14

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

ALTER TABLE [table]
ADD Column1 Datatype

Например,

ALTER TABLE [test]
ADD ID Int

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

ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL

13

Это для 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

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

11

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

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

10

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

ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue

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


6
этот ответ, данный другим пользователем на этот вопрос
janith1024

9
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)

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


9

Ну, теперь у меня есть некоторые изменения в моем предыдущем ответе. Я заметил, что ни один из ответов не упоминается 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]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.