SQL Serverの既存のテーブルにデフォルト値の列を追加する


回答:


3498

構文:

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。


332
列がNULL可能である場合、NULLは既存の行に使用される値になることに注意してください。
Richard Collette

17
@Thecrocodilehunter Nullable columnは、列の値にNullを挿入できることを意味します。null許容列ではない場合は、そのデータ型の値を挿入する必要があります。そのため、既存のレコードの場合、Nullがそれらに挿入され、新しいレコードには、特に指定されていない限り、デフォルト値が挿入されます。理にかなっていますか?
-Yatrix

41
この答えは、デフォルトの制約に明示的に名前を付けているため、dbuggerの答えよりも少し優れています。デフォルトの制約は、名前が自動生成されることを除いて、dbuggerの構文を使用して引き続き作成されます。正確な名前を知ることは、DROP-CREATEスクリプトを作成するときに便利です。
Walter Stabosz

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;columnに2つのNULL値が表示されますb
ErikE 2013年

48
WITH VALUES既存のNULL可能行を更新するために使用します。MSDNを参照してください:「追加された列がnull値を許可しWITH VALUES、指定されている場合、デフォルト値は新しい列に保存され、既存の行に追加されます。」
Yahoo Serious 14

1008
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO

DEFAULTを含めると、既存の行の列がデフォルト値で埋められるため、NOT NULL制約に違反しません。


13
その答えの問題は、デフォルト値が新しいレコードに対してのみ有効であることです。既存のレコードには引き続きNULL値が含まれます。
Roee Gavirel、2011年

130
あなたはそうではないことがわかります。そうしないと、制約に違反します。
dbugger

35
既存の行の列にはデフォルト値が入力されます。少し経験的なテストはそれを証明します。
dbugger

80
明確にするために-「NOT NULL」をコマンドから省略した場合、既存の行の値は更新されず、NULLのままになります。コマンドに「NOT NULL」が含まれている場合、既存の行の値はデフォルトと一致するように更新されます。
Stack Man

15
複数の列の場合、 ALTER TABLE table_1 ADD col_1 int NOT NULL DEFAULT(1)、col_2 int NULL
aads

233

追加する場合はNULL可能列をWITH VALUES特定のデフォルト値は、既存の行に適用されていることを確認します。

ALTER TABLE table
ADD column BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES

13
これがポイントです。DEFAULT制約のある列が常に値を持っていると仮定するのは簡単です。つまり、NOT NULLが指定されていなくても、NULLにはなりません。
Bill Brinkley、2012年

6
@tkocmathlaええと、私はBITデータ型について話しているのではなく、この特定のBIT について話していました。答えを見てくださいNOT NULL。列はとして宣言されています。
rsenna 2014

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
これは、デフォルト値の制約の前に新しい「null不可」列が作成されるため、テーブルに既にコンテンツがある場合は機能しません
WDuffy

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

13
これはnullを追加する前にnullにする必要があります
baaroz 2013

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サンプル
Kiquenet

98

2行のみの最も基本的なバージョン

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

これらは、デフォルト値を使用して既存のデータベーステーブルに列を追加する2つの方法です。


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では、テストデータベースでデザインモードに移動し、デザイナーを使用して2つの列を追加し、GUIで設定を行った後、悪名高いユーザーRight-Clickが[ 変更スクリプトの生成 ]オプションを提供します。

Bang upは小さなウィンドウをポップアップします。ご想像どおり、適切にフォーマットされた動作保証された変更スクリプトです。簡単なボタンを押してください。


48

または、制約に明示的に名前を付けることなく、デフォルトを追加できます。

ALTER TABLE [schema].[tablename] ADD  DEFAULT ((0)) FOR [columnname]

この制約を作成するときに既存のデフォルト制約に問題がある場合は、次の方法で削除できます。

alter table [schema].[tablename] drop constraint [constraintname]

1
参考までに、メンテナンスを容易にするために、標準の命名スキーム(「DF_Table_Column」など)を使用して制約に明示的に名前を付けます。それ以外の場合は、制約を見つけるにはさらに多くの作業が必要です。
マイククリスチャン

43

これは、SSMS GUIでも実行できます。以下にデフォルトの日付を示しますが、デフォルト値はもちろん何でも構いません。

  1. テーブルをデザインビューに配置します(オブジェクトエクスプローラー->デザインでテーブルを右クリックします)
  2. テーブルに列を追加します(または、列が既に存在する場合は、更新する列をクリックします)。
  3. 下の列のプロパティでは、入力した(getdate())abc、または0あなたが好きな値またはデフォルト値またはバインディングの下写真のようフィールド:

ここに画像の説明を入力してください





22

まず、studentという名前のテーブルを作成します。

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

1つの列を追加します。

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

これにより、列を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


18

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))

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テーブルを変更する前のチェックが好きです。非常に良い解決策です。これがどのように機能するかについてのいくつかの追加の解説は、それをさらにより便利にするでしょう。
Michael Gaskill

17
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO

多分画像を実際のコードで置き換えますか?そのままコピーして貼り付けるのは難しい。
David Faber

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]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.