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ステートメント:
これWITH VALUES
は、列がNULL可能で
、既存のレコードにデフォルト値を使用する場合にのみ必要です。
列がの場合、
指定するかどうかに関係なく、すべての既存のレコードのNOT NULL
デフォルト値が自動的に使用され
ますWITH VALUES
。
挿入がデフォルトの制約でどのように機能するか:
レコードをに挿入し、の値を指定SomeTable
しないSomeCol
場合、デフォルトはになり0
ます。
あなたがレコードを挿入した場合と指定しSomeCol
ての値をNULL
(そして、あなたの列が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;
columnに2つのNULL値が表示されますb
。
WITH VALUES
既存のNULL可能行を更新するために使用します。MSDNを参照してください:「追加された列がnull値を許可しWITH VALUES
、指定されている場合、デフォルト値は新しい列に保存され、既存の行に追加されます。」
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO
DEFAULTを含めると、既存の行の列がデフォルト値で埋められるため、NOT NULL制約に違反しません。
追加する場合はNULL可能列を、WITH VALUES
特定のデフォルト値は、既存の行に適用されていることを確認します。
ALTER TABLE table
ADD column BIT -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
DEFAULT
制約のある列が常に値を持っていると仮定するのは簡単です。つまり、NOT NULL
が指定されていなくても、NULLにはなりません。
BIT
データ型について話しているのではなく、この特定のBIT
列について話していました。答えを見てくださいNOT NULL
。列はとして宣言されています。
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'
使用する:
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
これらは、デフォルト値を使用して既存のデータベーステーブルに列を追加する2つの方法です。
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();''' ;
または、制約に明示的に名前を付けることなく、デフォルトを追加できます。
ALTER TABLE [schema].[tablename] ADD DEFAULT ((0)) FOR [columnname]
この制約を作成するときに既存のデフォルト制約に問題がある場合は、次の方法で削除できます。
alter table [schema].[tablename] drop constraint [constraintname]
ALTER TABLE ADD ColumnName {Column_Type} Constraint
MSDNの記事ALTER TABLE(Transact-SQL)には、すべてのテーブル変更構文があります。
これには多くの答えがありますが、この拡張メソッドを追加する必要があると感じています。これはずっと長いように見えますが、アクティブなデータベースの何百万もの行を持つテーブルに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以外のフィールドを追加する場合、すべての行に書き込む必要があるため、列を追加してすべての値を書き込むときにテーブル全体がロックアウトされるためです。
このメソッドは、それ自体ではるかに高速に動作するnull許容列を追加し、nullでないステータスを設定する前にデータを入力します。
1つのステートメントですべてを実行すると、よりアクティブなテーブルの1つが4〜8分間ロックアウトされ、プロセスを強制終了することがよくあります。この方法では、通常、各部分に数秒しかかからず、ロックが最小限に抑えられます。
さらに、数十億行の領域にテーブルがある場合は、次のように更新をバッチ処理する価値があります。
WHILE 1=1
BEGIN
UPDATE TOP (1000000) {schemaName}.{tableName}
SET {columnName} = {DefaultValue}
WHERE {columName} IS NULL
IF @@ROWCOUNT < 1000000
BREAK;
END
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
これは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
これにより、テーブルに新しい列が追加されます。
さて、私は今私の以前の答えにいくつかの変更があります。私は答えのどれも言及していないことに気づきました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]