Добавление столбца со значением по умолчанию в существующую таблицу в 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
Необязательный Оператор С-Values:
ЭлементWITH VALUES
требуется только тогда, когда ваш столбец обнуляется
и вы хотите, чтобы значение по умолчанию использовалось для существующих Учетная документация.
Если ваш столбецNOT NULL
, затем он будет автоматически использовать значение по умолчанию
для всех существующих записей укажите ли выWITH VALUES
или нет.как вставки работают с ограничением по умолчанию:
Если вы вставляете запись вSomeTable
и не указатьSomeCol
's значение, то он будет по умолчанию0
.
Если вы вставляете запись и указатьSomeCol
' s значение какNULL
(и ваш столбец допускает значения null),
тогда ограничение по умолчанию будет не использоваться иNULL
будет вставлен в качестве значения.Примечания были основаны на большой обратной связи каждого ниже.
Особая благодарность:
@Yatrix, @WalterStabosz, @YahooSerious и @StackMan за их комментарии.
ALTER TABLE Protocols ADD ProtocolTypeID int NOT NULL DEFAULT(1) GO
включение по умолчанию заполняет столбец в существующей строки со значением по умолчанию, поэтому ограничение NOT NULL не нарушается.
при добавлении столбец с нулевым значением,
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
остерегайтесь, когда колонна добавляемая
NOT NULL
ограничение нетDEFAULT
ограничения (значения). Элемент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 кроме того, щелкнув правой кнопкой мыши таблицу в меню Дизайн, установив значение по умолчанию table.
и, кроме того, если вы хотите добавить один и тот же столбец (если он не существует) во все таблицы в базе данных, то используйте:
USE AdventureWorks; EXEC sp_msforeachtable 'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;
в SQL Server 2008-R2 я перехожу в режим разработки-в тестовую базу данных - и добавляю свои два столбца с помощью конструктора и делаю настройки с графическим интерфейсом, а затем печально известный Щелкните Правой Кнопкой Мыши дает возможность "Изменить Скрипт"!
Bang up выскакивает небольшое окно с, как вы уже догадались, правильно отформатированным сценарием гарантированного изменения. Нажмите на легкую кнопку.
кроме того, вы можете добавить значение по умолчанию без необходимости явно называть ограничение:
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.
Это можно сделать и в графическом интерфейсе SSMS. Я показываю дату по умолчанию ниже, но значение по умолчанию может быть любым, конечно.
- поместите таблицу в режиме конструктора (щелкните правой кнопкой мыши на таблице в объекте проводник->проектирование)
- добавить столбец в таблицу (или нажмите на столбец, который вы хотите обновить, если он уже существует)
- в свойствах столбца ниже, введите
(getdate())
илиabc
или0
или любое значение, которое вы хотите в значение по умолчанию или Привязка поле, как показано ниже:
SQL Server + Alter Table + Add Column + Default Value uniqueidentifier
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
об этом уже много ответов, но я чувствую необходимость добавить этот расширенный метод. Это кажется намного дольше, но это чрезвычайно полезно, если вы добавляете не нулевое поле в таблицу с миллионами строк в активной базе данных.
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
Это можно сделать с помощью ниже код.
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]