SQL Server 2000 / SQL Server 2005の既存のテーブルにデフォルト値の列を追加するにはどうすればよいですか?
43 に答える
構文:
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.
ノート:
オプションの制約名:省略
した場合、SQLServer
は次のような面白い名前でデフォルト制約を自動生成しCONSTRAINT D_SomeTable_SomeCol
ます。DF__SomeTa__SomeC__4FB7FEF6
オプションのWith-Valuesステートメント:
これは、列がNull可能
であり、既存のレコードにデフォルト値を使用するWITH VALUES
場合にのみ必要です。
列がの場合、
指定するかどうかに関係なく、すべての既存のレコードのデフォルト値が自動的に使用されます。NOT NULL
WITH VALUES
挿入がデフォルト制約でどのように機能するか:
レコードをに挿入し、の値を指定SomeTable
しない場合、デフォルトはになります。
レコードを挿入し、の値をとして指定する場合(および、列でnullを許可する
場合)、Default-Constraintは使用されず、値として挿入されます。SomeCol
0
SomeCol
NULL
NULL
メモは、以下の皆さんのすばらしいフィードバックに基づいています。
コメントを寄せてくれた@Yatrix、@ WalterStabosz、@ YahooSerious、@StackManに特に
感謝します。
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO
DEFAULTを含めると、既存の行の列がデフォルト値で埋められるため、NOTNULL制約に違反することはありません。
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'
2行のみの最も基本的なバージョン
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
これらは、既定値を持つ既存のデータベース テーブルに列を追加する 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();''' ;
In SQL Server 2008-R2, I go to the design mode - in a test database - and add my two columns using the designer and made the settings with the GUI, and then the infamous Right-Click gives the option "Generate Change Script"!
Bang up pops a little window with, you guessed it, the properly formatted guaranteed-to-work change script. Hit the easy button.
または、制約に明示的に名前を付けることなく、デフォルトを追加できます。
ALTER TABLE [schema].[tablename] ADD DEFAULT ((0)) FOR [columnname]
この制約を作成するときに既存のデフォルトの制約に問題がある場合は、次の方法でそれらを削除できます。
alter table [schema].[tablename] drop constraint [constraintname]
ALTER TABLE ADD ColumnName {Column_Type} Constraint
MSDNの記事ALTERTABLE(Transact-SQL)には、すべてのaltertable構文があります。
例:
ALTER TABLE [Employees] ADD Seniority int not null default 0 GO
例:
ALTER TABLE tes
ADD ssd NUMBER DEFAULT '0';
SQL Server + テーブルの変更 + 列の追加 + デフォルト値の 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 [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)
このクエリから、デフォルト値 0 の整数データ型の列を追加できます。
デフォルトが Null の場合:
- SQL Server で、対象のテーブルのツリーを開きます
- 「列」を右クリック ==>
New Column
- 列の名前を入力し
Select Type
、[Null を許可] チェックボックスをオンにします。 - メニューバーから、
Save
終わり!
テーブル名を右クリックして [デザイン] をクリックし、最後の列名の下をクリックして、[列名]、[データ型]、[Null を許可] と入力します。
次に、ページの下部でデフォルト値またはバインディングを設定します。文字列の場合は「1」、int の場合は 1 などです。
SQL Server + テーブルの変更 + 列の追加 + デフォルト値の uniqueidentifier...
ALTER TABLE [TABLENAME] ADD MyNewColumn INT not null default 0 GO
ALTER TABLE Table1 ADD Col3 INT NOT NULL DEFAULT(0)
OFFLINE
また、ONLINE
MySQL Cluster テーブルで実行される ALTER テーブルの方法に関連しています。MySQL Cluster は、MySQL NDB Cluster 7.3 以降で ALGORITHM=INPLACE 構文を使用したオンライン ALTER TABLE 操作をサポートしています。MySQL Cluster は、ONLINE および OFFLINE キーワードを使用する NDB に固有の古い構文もサポートしています。これらのキーワードは、MySQL NDB Cluster 7.3 以降では非推奨です。それらは MySQL NDB Cluster 7.4 で引き続きサポートされますが、MySQL Cluster の将来のバージョンでは削除される可能性があります。
IGNORE
ALTER ステートメントが、制約 UNIQUE を新しく追加した列の重複値をどのように処理するかに関係します。IGNORE が指定されていない場合、ALTER は失敗し、適用されません。IGNORE が指定されている場合、すべての重複行の最初の行が保持され、リセットが削除され、ALTER が適用されます。
それALTER_SPECIFICATION
はあなたが変えようとしているものです。追加、削除、または変更する列またはインデックス、または列に適用する制約。
ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name
alter_specification [, alter_specification] ...
alter_specification:
...
ADD [COLUMN] (col_name column_definition,...)
...
Eg: ALTER TABLE table1 ADD COLUMN foo INT DEFAULT 0;
この問題に対処するには、2 つの異なる方法があります。どちらもデフォルト値を追加しますが、ここでの問題ステートメントにまったく異なる意味を追加します。
サンプルデータの作成から始めましょう。
サンプル データの作成
CREATE TABLE ExistingTable (ID INT)
GO
INSERT INTO ExistingTable (ID)
VALUES (1), (2), (3)
GO
SELECT *
FROM ExistingTable
1.将来の挿入のためにデフォルト値で列を追加する
ALTER TABLE ExistingTable
ADD ColWithDefault VARCHAR(10) DEFAULT 'Hi'
GO
したがって、新しいレコードを挿入するときにデフォルトの列を追加したので、値が指定されて'Hi'
いない場合はデフォルトで値が設定されます
INSERT INTO ExistingTable(ID)
VALUES (4)
GO
Select * from ExistingTable
GO
さて、これはデフォルト値を持つという私たちの問題に対処しますが、ここに問題のキャッチがあります。将来の挿入だけでなく、すべての列にデフォルト値を設定したい場合はどうなりますか? これには方法 2 があります。
2.すべての挿入のデフォルト値で列を追加します
ALTER TABLE ExistingTable
ADD DefaultColWithVal VARCHAR(10) DEFAULT 'DefaultAll'
WITH VALUES
GO
Select * from ExistingTable
GO
次のスクリプトは、考えられるすべてのシナリオでデフォルト値を持つ新しい列を追加します。
尋ねられた質問に価値が追加されることを願っています。ありがとう。
ALTER テーブル dataset.tablename ADD column_current_ind integer DEFAULT 0
構文:
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES
例:
ALTER TABLE Admin_Master
ADD Can_View_Password BIT NULL
CONSTRAINT DF_Admin_Master_Can_View_Password DEFAULT (1)
WITH VALUES