既存のテーブルから列を削除する方法は?
とのテーブルMEN
がFname
ありますLname
私は削除する必要があります Lname
どうやってするの?
既存のテーブルから列を削除する方法は?
とのテーブルMEN
がFname
ありますLname
私は削除する必要があります Lname
どうやってするの?
回答:
ALTER TABLE MEN DROP COLUMN Lname
あなたの例はシンプルで、追加のテーブル変更は必要ありませんが、一般的に言えば、これはそれほど簡単ではありません。
この列が他のテーブルによって参照されている場合、他のテーブル/列をどうするかを理解する必要があります。1つのオプションは、外部キーを削除し、参照されたデータを他のテーブルに保持することです。
別のオプションは、すべての参照列を検索し、不要になった場合はそれらを削除することです。
このような場合、実際の課題は、すべての外部キーを見つけることです。これを行うには、システムテーブルをクエリするか、ApexSQL Search(無料)やRed Gate Dependency Tracker(プレミアムですがその他の機能)などのサードパーティツールを使用します。ここに外部キーに関するスレッドがあります
これが正解です。
ALTER TABLE MEN DROP COLUMN Lname
しかし、もし... CONSTRAINT
上に存在しているCOLUMN
、あなたはしなければならない最初に、あなたのことができるようになります。を削除するには、次を実行:DROP
CONSTRAINT
DROP
COLUMN
CONSTRAINT
ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
constraint
のためのコラム?
ではSQL Serverの2016新しいDIEステートメントを使用することができます。
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
上記のクエリは、テーブル内にあるdrops
場合にのみ列で再実行でき、exists
それ以外の場合はエラーをスローしません。
大きなIF
ラッパーを使用してcolumn
ドロップする前に存在を確認する代わりに、上記のDDL
ステートメントを実行することができます
問題は、存在しないテーブルからのみ列を削除できるかどうかです;-)
BEGIN TRANSACTION
IF exists (SELECT * FROM sys.columns c
INNER JOIN sys.objects t ON (c.[object_id] = t.[object_id])
WHERE t.[object_id] = OBJECT_ID(N'[dbo].[MyTable]')
AND c.[name] = 'ColumnName')
BEGIN TRY
ALTER TABLE [dbo].[MyTable] DROP COLUMN ColumnName
END TRY
BEGIN CATCH
print 'FAILED!'
END CATCH
ELSE
BEGIN
SELECT ERROR_NUMBER() AS ErrorNumber;
print 'NO TABLE OR COLUMN FOUND !'
END
COMMIT
これに対する簡単な答えは、これを使用することです:
ALTER TABLE MEN DROP COLUMN Lname;
次のように複数の列を指定できます。
ALTER TABLE MEN DROP COLUMN Lname, secondcol, thirdcol;
SQL Server 2016からは、存在する場合にのみ列を削除することもできます。これにより、列が存在しないときにエラーが発生するのを防ぐことができます。
ALTER TABLE MEN DROP COLUMN IF EXISTS Lname;
列を削除するには、いくつかの前提条件があります。ドロップする列は次のようなものにはできません。
上記のいずれかに該当する場合は、最初にそれらの関連付けを削除する必要があります。
また、列を削除しても、テーブルのクラスター化インデックスが再構築されるまで、ハードディスクから領域が解放されないことに注意してください。そのため、上記のように次のようなテーブル再構築コマンドを実行することをお勧めします。
ALTER TABLE MEN REBUILD;
最後に、これは遅くなる可能性があり、おそらくその間テーブルをロックするだろうといくつかの人が言ったように。目的の構造で新しいテーブルを作成し、次のように名前を変更することができます。
SELECT
Fname
-- Note LName the column not wanted is not selected
INTO
new_MEN
FROM
MEN;
EXEC sp_rename 'MEN', 'old_MEN';
EXEC sp_rename 'new_MEN', 'MEN';
DROP TABLE old_MEN;
ただし、最初の選択コマンドと最後の名前変更コマンドの間に、挿入された行のデータが失われるウィンドウがあることに注意してください。
C#を使用していて、Identity列がintである場合は、値を提供せずにintの新しいインスタンスを作成します。
[identity_column] = new int()