Как добавить столбец со значением по умолчанию в существующую таблицу в 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 сгенерирует автоматически
Контракт по умолчанию с забавным названием, например: DF__SomeTa__SomeC__4FB7FEF6
Необязательное выражение со значениями:
WITH VALUES
нужен только тогда, когда ваш столбец имеет значение NULL
и вы хотите, чтобы значение по умолчанию использовалось для существующих записей.
Если ваш столбец NOT NULL
, он автоматически будет использовать значение по умолчанию
для всех существующих записей, независимо от того, указываете вы WITH VALUES
или нет.
Как вставки работают с ограничением по умолчанию:
Если вы вставляете запись в SomeTable
и не указываете значение SomeCol
, то по умолчанию будет использоваться 0
. < br /> Если вы вставляете запись и , укажите значение SomeCol
как NULL
(и ваш столбец допускает нули),
тогда ограничение по умолчанию будет не использоваться, а NULL
будет вставлен в качестве значения.
Примечания основаны на замечательных отзывах всех, представленных ниже.
Особая благодарность:
@Yatrix, @WalterStabosz, @YahooSerious и @StackMan за их комментарии.
WITH VALUES
для обновления существующих строк, допускающих значение NULL. См. MSDN: "Если добавленный столбец допускает нулевые значения и WITH VALUES
, значение по умолчанию сохраняется в новом столбце и добавляется к существующим строкам ".
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO
Включение DEFAULT заполняет столбец в существующих строках значением по умолчанию, поэтому ограничение NOT NULL не нарушается.
При добавлении столбца, допускающего значение NULL , WITH VALUES
гарантирует, что конкретное значение DEFAULT применяется к существующим строкам:
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'
Самая простая версия только с двумя строками
ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0
Будьте осторожны, если столбец, который вы добавляете, имеет ограничение NOT NULL
, но не имеет ограничения (значения) DEFAULT
. Оператор ALTER TABLE
завершится ошибкой в том случае, если в таблице есть какие-либо строки. Решение состоит в том, чтобы либо удалить ограничение NOT NULL
из нового столбца, либо предоставить для него ограничение DEFAULT
.
Использование:
-- 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)
Чтобы добавить столбец в существующую таблицу базы данных со значением по умолчанию, мы можем использовать:
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
Это два способа добавить столбец в существующую таблицу базы данных со значением по умолчанию.
Вы можете сделать это с помощью 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 я перехожу в режим разработки - в тестовой базе данных - и добавляю два столбца с помощью конструктора и выполняю настройки с помощью графического интерфейса, а затем печально известный щелчок правой кнопкой мыши дает опция « Создать сценарий изменения »!
На экране появится небольшое окошко с, как вы уже догадались, правильно отформатированным сценарием гарантированно работающего изменения. Нажмите простую кнопку.
В качестве альтернативы вы можете добавить значение по умолчанию без явного указания ограничения:
ALTER TABLE [schema].[tablename] ADD DEFAULT ((0)) FOR [columnname]
Если при создании этого ограничения у вас возникла проблема с существующими ограничениями по умолчанию, их можно удалить:
alter table [schema].[tablename] drop constraint [constraintname]
Это также можно сделать в графическом интерфейсе SSMS. Я показываю дату по умолчанию ниже, но значение по умолчанию, конечно, может быть любым.
- Поместите свою таблицу в представление дизайна (щелкните правой кнопкой мыши таблицу в проводнике объектов-> Дизайн)
- Добавьте столбец в таблицу (или щелкните столбец, который вы хотите обновить, если он уже существует)
- В свойствах столбца ниже введите
(getdate())
или'abc'
или0
или любое другое значение, которое вы хотите, в поле Значение по умолчанию или Привязка , как показано ниже:
ALTER TABLE ADD ColumnName {Column_Type} Constraint
Статья MSDN ALTER TABLE (Transact-SQL) em> имеет весь синтаксис alter table.
Примере:
ALTER TABLE [Employees] ADD Seniority int not null default 0 GO
Примере:
ALTER TABLE tes
ADD ssd NUMBER DEFAULT '0';
Сначала создайте таблицу с именем ученика:
CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)
Добавьте к нему один столбец:
ALTER TABLE STUDENT
ADD STUDENT_NAME INT NOT NULL DEFAULT(0)
SELECT *
FROM STUDENT
Таблица создается, и в существующую таблицу добавляется столбец со значением по умолчанию.
Здесь много ответов, но я чувствую необходимость добавить этот расширенный метод. Кажется, что это намного больше, но это чрезвычайно полезно, если вы добавляете поле 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
Что это будет делать, так это добавить столбец как поле, допускающее значение NULL, и со значением по умолчанию, обновить все поля до значения по умолчанию (или вы можете назначить более значимые значения), и, наконец, он изменит столбец на NOT NULL.
Причина этого в том, что если вы обновляете крупномасштабную таблицу и добавляете новое ненулевое поле, которое оно должно записывать в каждую отдельную строку, и тем самым блокирует всю таблицу, поскольку она добавляет столбец, а затем записывает все значения.
Этот метод добавит столбец, допускающий значение 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
Попробуй это
ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
SQL Server + Изменить таблицу + Добавить столбец + Уникальный идентификатор значения по умолчанию
ALTER TABLE Product
ADD ReferenceID uniqueidentifier not null
default (cast(cast(0 as binary) as uniqueidentifier))
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
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
Это для 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
Добавьте в таблицу новый столбец:
ALTER TABLE [table]
ADD Column1 Datatype
Например,
ALTER TABLE [test]
ADD ID Int
Если пользователь хочет, чтобы он увеличивался автоматически, тогда:
ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL
Это можно сделать с помощью приведенного ниже кода.
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 MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue
Это добавит новый столбец в таблицу.
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)
Из этого запроса вы можете добавить столбец целочисленного типа данных со значением по умолчанию 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-сервера. Но если его нет, то в первый раз при выполнении не будет ошибки.
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
[WITH VALUES]
Похожие вопросы
Связанные вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.