Додайте стовпчик із значенням за замовчуванням до наявної таблиці в SQL Server


Відповіді:


3497

Синтаксис:

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

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

Як вставки працюють із обмеженням за замовчуванням:
Якщо ви вставите запис у значення SomeTableі не вкажіть SomeColзначення, тоді воно буде за замовчуванням 0.
Якщо ви вставите значення Запис і вкажіть SomeColяк NULL(а ваш стовпець допускає нулі),
    то За умовчанням обмеження не буде використовуватися і NULLбуде вставлено як значення.

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


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

17
@Thecrocodilehunter Nullable означає, що ви можете вставити Null для значення стовпців. Якщо це не нульовий стовпець, вам потрібно вставити якесь значення цього типу даних. Отже, для існуючих записів у них буде вставлено Null, а в нових записах буде вставлено ваше значення за замовчуванням, якщо не вказано інше. Мати сенс?
Ятрікс

41
Мені подобається ця відповідь трохи краща за відладчик, оскільки вона чітко називає обмеження за замовчуванням. Обмеження за замовчуванням все ще створюється за допомогою синтаксису 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 значення NULL для стовпця 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.
Roee Gavirel

130
Ви виявите, що це не так. Інакше обмеження буде порушено.
dbugger

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

80
Просто для уточнення - якщо команда "NOT NULL" пропущена з команди, значення для існуючих рядків НЕ буде оновлено і залишиться NULL. Якщо в команду включено "NOT NULL", значення для існуючих рядків буде оновлено, щоб відповідати типовому.
Стек чоловік

15
Для кількох стовпців ПІД ТАБЛИЦІ таблиця_1 ДОДАТИ col_1 int NOT NULL DEFAULT (1), col_2 int NULL
aads

233

Додаючи нульовий стовпець , WITH VALUESпереконайтеся, що конкретне значення DEFAULT застосовується до існуючих рядків:

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
Це не спрацює, якщо в таблиці вже є вміст, оскільки новий стовпець "не
зведений до нуля

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

13
це додавання null! повинно бути недійсним раніше
baaroz

5
@baaroz, це працює з NOT NULL: ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR (200) NOT NULL DEFAULT 'SNUGGLES'
shaijut

100

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


2
будь-який зразок SQL про це?
Кікенет

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
FYI, чітко називаючи обмеження за допомогою стандартної схеми іменування (наприклад, "DF_Table_Column"), для зручності обслуговування. В іншому випадку пошук обмеження вимагає більше роботи.
Майк Крістіан

43

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

  1. Поставте свою таблицю в дизайнерський вигляд (Клацніть правою кнопкою миші на таблиці в Explorer Explorer-> Дизайн)
  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

Для цього потрібно додати стовпчик як поле, що зводиться до нуля, і за замовчуванням оновіть усі поля до значення за замовчуванням (або ви можете призначити більш значущі значення), і, нарешті, це змінить стовпець на НЕ НУЛЬНИЙ.

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

Цей метод додасть нульовий стовпчик, який працює набагато швидше сам по собі, а потім заповнює дані перед встановленням ненульового статусу.

Я виявив, що виконання всього за один вислів заблокує одну з наших більш активних таблиць на 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 + Таблиця змін + Додати стовпець + унікальний ідентифікатор значення за замовчуванням

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
Це не додає ніякої цінності для вже існуючих відповідей років тому.
nvoigt

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
Це не додає ніякої цінності для вже існуючих відповідей років тому.
nvoigt

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.