Як я можу додати стовпчик зі значенням за замовчуванням до наявної таблиці в SQL Server 2000 / SQL Server 2005 ?
Як я можу додати стовпчик зі значенням за замовчуванням до наявної таблиці в SQL Server 2000 / SQL Server 2005 ?
Відповіді:
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
потрібне лише тоді, коли ваш стовпець є нульовим
і ви хочете, щоб значення за замовчуванням використовувалося для існуючих записів
Якщо ваш стовпець є NOT NULL
, то він автоматично використовуватиме значення за замовчуванням
для всіх існуючих записів, незалежно від того, вказали ви WITH VALUES
чи ні.
Як вставки працюють із обмеженням за замовчуванням:
Якщо ви вставите запис у значення SomeTable
і не вкажіть SomeCol
значення, тоді воно буде за замовчуванням 0
.
Якщо ви вставите значення Запис і вкажіть SomeCol
як NULL
(а ваш стовпець допускає нулі),
то За умовчанням обмеження не буде використовуватися і NULL
буде вставлено як значення.
Примітки ґрунтувалися на чудових відгуках, поданих нижче.
Особлива подяка:
@Yatrix, @WalterStabosz, @YahooSerious та @StackMan за їх коментарі.
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
.
WITH VALUES
для оновлення наявних змінних рядків. Див. MSDN : "Якщо доданий стовпець дозволяє нульові значення і WITH VALUES
вказаний, значення за замовчуванням зберігається у новому стовпці, доданому до існуючих рядків."
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO
Включення DEFAULT заповнює стовпець у існуючих рядках за замовчуванням, тому обмеження NOT NULL не порушується.
Додаючи нульовий стовпець , WITH VALUES
переконайтеся, що конкретне значення DEFAULT застосовується до існуючих рядків:
ALTER TABLE table
ADD column BIT -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
DEFAULT
обмеженням завжди матиме значення - тобто не бути NULL, хоча NOT NULL
він не вказаний.
BIT
тип даних, я говорив про цей конкретний BIT
стовпець . Подивіться на відповідь, стовпець оголошено як NOT NULL
.
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 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 я переходжу до режиму проектування - у тестову базу даних - і додаю два мої стовпчики за допомогою конструктора і робив налаштування з графічним інтерфейсом, а потім сумнозвісний Right-Clickдає опцію " Створити сценарій зміни "!
Вибух вискакує віконце з, як ви здогадалися, належним чином відформатованим сценарієм змін із гарантованою роботою. Натисніть просту кнопку.
Крім того, ви можете додати за замовчуванням без необхідності чітко називати обмеження:
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) є весь синтаксис таблиці змін.
Приклад:
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
Для цього потрібно додати стовпчик як поле, що зводиться до нуля, і за замовчуванням оновіть усі поля до значення за замовчуванням (або ви можете призначити більш значущі значення), і, нарешті, це змінить стовпець на НЕ НУЛЬНИЙ.
Причиною цього є те, що якщо ви оновлюєте таблицю великого масштабу і додаєте нове ненуле поле, воно повинно записуватися в кожен рядок, і цим чином заблокуйте всю таблицю, коли вона додає стовпець, а потім записує всі значення.
Цей метод додасть нульовий стовпчик, який працює набагато швидше сам по собі, а потім заповнює дані перед встановленням ненульового статусу.
Я виявив, що виконання всього за один вислів заблокує одну з наших більш активних таблиць на 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
NOT EXISTS
перевірка, перш ніж намагатися змінити таблицю. Дуже хороше рішення. Деякі додаткові коментарі до того, як це працює, зробить його ще кориснішим.
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
Додати новий стовпець до таблиці:
ALTER TABLE [table]
ADD Column1 Datatype
Наприклад,
ALTER TABLE [test]
ADD ID Int
Якщо користувач хоче зробити його автоматичним збільшенням:
ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL
Це для 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
Це можна зробити за допомогою наведеного нижче коду.
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]