Добавить столбец со значением по умолчанию в существующую таблицу в SQL Server - PullRequest
2519 голосов
/ 18 сентября 2008

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

Ответы [ 37 ]

18 голосов
/ 26 апреля 2016
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
17 голосов
/ 01 сентября 2014

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

ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
15 голосов
/ 05 мая 2017

На это есть много ответов, но я чувствую необходимость добавить этот расширенный метод. Это кажется намного дольше, но это чрезвычайно полезно, если вы добавляете поле 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
15 голосов
/ 08 февраля 2018
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
13 голосов
/ 22 декабря 2015

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

ALTER TABLE [table]
ADD Column1 Datatype

Например,

ALTER TABLE [test]
ADD ID Int

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

ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL
11 голосов
/ 09 сентября 2016

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

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
9 голосов
/ 24 мая 2016
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)

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

8 голосов
/ 09 марта 2017

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

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

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

Готово! * * 1016

7 голосов
/ 15 марта 2017

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

ALTER TABLE tableName ADD ColumnName datatype DEFAULT DefaultValue;
...