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

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

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

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

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

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


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

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


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

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

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

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

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


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

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0

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

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

ALTER TABLE myTableName  
ADD RecordAddedDate smalldatetime NULL DEFAULT(GetDate())  
GO 

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

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

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

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

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


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

в SQL Server 2008-R2 я перехожу в режим разработки-в тестовую базу данных-и добавляю свои два столбца с помощью конструктора и делаю настройки с помощью GUI, а затем печально известного Щелкните Правой Кнопкой Мыши дает возможность "Изменить Скрипт"!

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


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

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

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

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

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

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

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

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

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


ALTER TABLE ADD ColumnName {Column_Type} Constraint

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


пример:

ALTER TABLE [Employees] ADD Seniority int not null default 0 GO

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

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

enter image description here


пример:

ALTER TABLE tes 
ADD ssd  NUMBER   DEFAULT '0';

SQL Server + Alter Table + Add Column + значение по умолчанию uniqueidentifier

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

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

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

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

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

SELECT * 
FROM STUDENT

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

Image 1


попробуй такое

ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO

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

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

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

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

этот метод добавит столбец nullable, который работает намного быстрее сам по себе, а затем заполняет данные перед установкой статуса 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

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

ALTER TABLE [table]
ADD Column1 Datatype

например,

ALTER TABLE [test]
ADD ID Int

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

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

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

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

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

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

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


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

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

Если значение по умолчанию равно Null, то:

  1. в SQL Server откройте дерево целевой таблицы
  2. щелкните правой кнопкой мыши "столбцы"==>New Column
  3. введите имя столбца, Select Type и установите флажок Разрешить значения null
  4. в строке меню, нажмите кнопку Save

готово!


SQL Server + Alter Table + Add Column + значение по умолчанию uniqueidentifier...

ALTER TABLE [TABLENAME] ADD MyNewColumn INT not null default 0 GO