既存のテーブルから列を削除する方法は?


回答:



157

一般:

ALTER TABLE table_name DROP COLUMN column_name;

あなたの場合:

ALTER TABLE MEN DROP COLUMN Lname;

72

あなたの例はシンプルで、追加のテーブル変更は必要ありませんが、一般的に言えば、これはそれほど簡単ではありません。

この列が他のテーブルによって参照されている場合、他のテーブル/列をどうするかを理解する必要があります。1つのオプションは、外部キーを削除し、参照されたデータを他のテーブルに保持することです。

別のオプションは、すべての参照列を検索し、不要になった場合はそれらを削除することです。

このような場合、実際の課題は、すべての外部キーを見つけることです。これを行うには、システムテーブルをクエリするか、ApexSQL Search(無料)やRed Gate Dependency Tracker(プレミアムですがその他の機能)などのサードパーティツールを使用します。ここに外部キーに関するスレッドがあります


47

これが正解です。

ALTER TABLE MEN DROP COLUMN Lname

しかし、もし... CONSTRAINT上に存在しているCOLUMN、あなたはしなければならない最初に、あなたのことができるようになります。を削除するには、次を実行:DROPCONSTRAINTDROPCOLUMNCONSTRAINT

ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}

ALTER TABLE tb_name DROP FOREIGN KEY key_name
bortunac

3
TO HOW-検索constraintのためのコラム
Kiquenet

21

ではSQL Serverの2016新しいDIEステートメントを使用することができます。

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

上記のクエリは、テーブル内にあるdrops場合にのみ列で再実行でき、existsそれ以外の場合はエラーをスローしません。

大きなIFラッパーを使用してcolumnドロップする前に存在を確認する代わりに、上記のDDLステートメントを実行することができます


3
DIE文
Kiquenet

3
ところで、あなたは「再実行可能な」スクリプト/関数のこれらのタイプ呼び出すことができるべき等を
tomosius

4
これは受け入れられる答えになるはずです。自動化されたSQLスクリプトのデプロイがある場合は、このように防御的にスクリプトを作成する必要があります。
ビクター

7

問題は、存在しないテーブルからのみ列を削除できるかどうかです;-)

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  

1
存在しないテーブルから列を削除する場合、これがその方法になると思います
Matiaan

6

これに対する簡単な答えは、これを使用することです:

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;

列を削除するには、いくつかの前提条件があります。ドロップする列は次のようなものにはできません。

  • インデックスで使用
  • CHECK、FOREIGN KEY、UNIQUE、またはPRIMARY KEY制約で使用されます
  • DEFAULTに関連付けられています
  • ルールに縛られる

上記のいずれかに該当する場合は、最初にそれらの関連付けを削除する必要があります。

また、列を削除しても、テーブルのクラスター化インデックスが再構築されるまで、ハードディスクから領域が解放されないことに注意してください。そのため、上記のように次のようなテーブル再構築コマンドを実行することをお勧めします。

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;

ただし、最初の選択コマンドと最後の名前変更コマンドの間に、挿入された行のデータが失われるウィンドウがあることに注意してください。


2

既存のテーブルに列を追加するには:

ALTER TABLE table_name
 ADD
 column_name DATATYPE NULL  

既存のテーブルの列を削除するには:

ALTER TABLE table_name
DROP COLUMN column_name

ADD列についての質問ではありません。
Kiquenet

2

これは、SSMS GUIを使用して行うこともできます。このメソッドの良い点は、その列に関係がある場合に警告を表示し、それらも自動的に削除できることです。

  1. 次のように、テーブルをデザインビューに配置します(テーブルを右クリックします)。

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

  1. テーブルのデザインビューで列を右クリックし、[列の削除]をクリックします

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

前述したように、削除する必要のある関係がある場合は、この時点でそれらも削除するかどうかを尋ねられます。列を削除するには、おそらくそうする必要があります。


0

C#を使用していて、Identity列がintである場合は、値を提供せずにintの新しいインスタンスを作成します。

[identity_column] = new int()


この答えは何をしますか?テーブルから列を削除しますか?
Prashant Pimpale

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