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

2202

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

Теги:
sql-server

32 ответа

2690
Лучший ответ
ALTER TABLE {TABLENAME} 
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} 
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
[WITH VALUES]
  • 313
    Имейте в виду, что если столбец имеет значение NULL, то значение NULL будет использоваться для существующих строк.
  • 2
    @RichardCollette, что такое обнуляемый столбец. Если мой тип данных int или varchar, он всегда принимает нулевое значение для существующих строк, даже если я указываю значение по умолчанию. Означает ли это, что значение по умолчанию относится только к новым записям?
Показать ещё 8 комментариев
820
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO

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

  • 13
    Проблема с этим ответом заключается в том, что значение по умолчанию действительно только для новых записей. Существующие записи по-прежнему будут иметь значение NULL.
  • 127
    Вы обнаружите, что это не так. В противном случае ограничение будет нарушено.
Показать ещё 6 комментариев
181

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

ALTER TABLE table
ADD column BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
  • 12
    Это ключевой момент. Легко предположить, что столбец с ограничением DEFAULT всегда будет иметь значение, то есть не будет NULL, даже если NOT NULL не указано.
  • 6
    @ tkocmathla О, я не говорил о BIT данных BIT , я говорил об этом конкретном столбце BIT . Посмотрите на ответ, столбец объявлен как NOT NULL .
109
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
    Это не будет работать, если в таблице уже есть содержимое, потому что новый столбец «не обнуляемый» создается до ограничения значения по умолчанию
  • 2
    Мой +1 идет за фрагмент после первого GO который добавляет ограничение к существующему столбцу.
89
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'
  • 12
    это добавление null! должно быть не null раньше
  • 3
    @baaroz, это работает с NOT NULL: ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR (200) NOT NULL ПО УМОЛЧАНИЮ 'SNUGGLES'
76

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

  • 0
    любой пример SQL об этом?
65

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

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0
56

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

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

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

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

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

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

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

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

37

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

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

36

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

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

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

alter table [schema].[tablename] drop constraint [constraintname]
  • 0
    К вашему сведению, явное именование ограничения с использованием стандартной схемы именования (например, «DF_Table_Column») для простоты обслуживания. В противном случае поиск ограничения требует больше работы.
35

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

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

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

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

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

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

25
ALTER TABLE ADD ColumnName {Column_Type} Constraint

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

21

Пример:

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

Пример:

ALTER TABLE tes 
ADD ssd  NUMBER   DEFAULT '0';
14

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

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

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

13

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

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

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

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

Добавьте в него один столбец:

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

SELECT * 
FROM STUDENT

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

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

11

Попробуйте это

ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
10
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 прежде чем пытаться изменить таблицу. Очень хорошее решение Некоторые дополнительные комментарии о том, как это работает, сделают его еще более полезным.
7

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

ALTER TABLE [table]
ADD Column1 Datatype

Например,

ALTER TABLE [test]
ADD ID Int

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

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

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

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

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
4
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)

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

3

Щелкните правой кнопкой мыши по таблице, щелкните под последним именем столбца и введите данные столбца.

Затем добавьте значение по умолчанию или привязку, например "1" для строки или 1 для int.

3

Вы можете использовать этот запрос:

ALTER TABLE tableName ADD ColumnName datatype DEFAULT DefaultValue;
3

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

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

  • В SQL Server откройте дерево целевой таблицы
  • Щелкните правой кнопкой мыши "Столбцы" == > New Column
  • Введите столбец Name, Select Type и отметьте флажок Разрешить Nulls
  • В строке меню нажмите Save

Готово!

3

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

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

шаг 1. ПЕРВАЯ ТЕБЯ ДОЛЖНА СДЕЛАТЬ ТАБЛИЦУ С ДОБАВЛЕНИЕМ ПОЛЯ

alter table table_name add field field_name data_type

step-2 CREATE DEFAULT

USE data_base_name;
GO
CREATE DEFAULT default_name AS 'default_value';

step-3 ТОГДА ВЫ ДОЛЖНЫ ИСПОЛНИТЬ ЭТУ ПРОЦЕДУРА

exec sp_bindefault 'default_name' , 'schema_name.table_name.field_name'

example -

USE master;
GO
EXEC sp_bindefault 'today', 'HumanResources.Employee.HireDate';

Ещё вопросы

Сообщество Overcoder
Наверх
Меню