NOT NULL列を既存のテーブルに挿入する


121

私が試してみました:

ALTER TABLE MY_TABLE 
ADD STAGE INT NOT NULL;

しかし、それはこのエラーメッセージを与えます:

ALTER TABLEでは、nullを含むか、DEFAULT定義が指定されている列のみを追加できます

回答:


222

オプションとして、最初にNULL可能列を作成し、次に有効な非NULL値でテーブル列を更新し、最後に列を変更してNOT NULL制約を設定できます。

ALTER TABLE MY_TABLE ADD STAGE INT NULL
GO
UPDATE MY_TABLE SET <a valid not null values for your column>
GO
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL
GO

別のオプションは、列に正しいデフォルト値を指定することです:

ALTER TABLE MY_TABLE ADD STAGE INT NOT NULL DEFAULT '0'

UPD:上記の回答GOには、Microsoft SQLサーバーでこのコードを実行する際に必須であるものが含まれていることに注意してください。OracleまたはMySQLで同じ操作を実行する場合は、;そのようなセミコロンを使用する必要があります。

ALTER TABLE MY_TABLE ADD STAGE INT NULL;
UPDATE MY_TABLE SET <a valid not null values for your column>;
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL;

1
個人的にフィールドに手動で入力できる値がある場合、私はここで最初の方法を好みます。そうすれば、デフォルトの制約が不要な場合でも、デフォルトの制約の作成や削除について心配する必要はありません。
マークWディクソン

1
@acarlon-私はそれが到達していると思います。updateあなたが言及する危険なステートメントはどんなクエリでも有害です。updateここのステートメントに追加の列があるかどうかを確認するのに十分簡単なはずです。通常は、一度に1列または2列だけを追加します。updateこの例では、たまたまそこに属していない余分な列をステートメントに追加した場合、最初からデータを担当するべきではありません。
マークWディクソン

1
SQLiteを使用するANDROID開発者ALTER COLUMNは、SQLiteではサポートされていないことに注意してください。
Sdghasemi

2
これまでに見GOたことありませんが、SQL仕様の一部ではないようです。そのため、それをサポートするツールのいずれかで実行されていないスクリプトが失敗する可能性があります。セミコロンを使用するだけですか?Microsoftの標準を普及させることはお勧めしません。確立された合理的な標準をほとんど気にしないためですが、独自に発明するためだけに独自の標準を発明します。それとは別に、役立つ答え。
Neonit

2
@Neonはコメントに感謝しますが、元の質問はMS SQLサーバーに関するものでした。そのため、GOが存在します。しかし、私はそれについてのメモを私の回答に追加します。
Pavel Morshenyuk 2016

13

列をNullにしない場合は、既存の行にデータを設定するためのデフォルトを提供する必要があります。例えば

ALTER TABLE dbo.YourTbl ADD
    newcol int NOT NULL CONSTRAINT DF_YourTbl_newcol DEFAULT 0

Enterprise Editionでは、これは2012年以降のメタデータのみの変更です


2
必須でありません、これは1つのオプションです。
マット

6

エラーメッセージは非常に説明的です、試してください:

ALTER TABLE MyTable ADD Stage INT NOT NULL DEFAULT '-';

そして、デフォルト部分の「マイナス」の意味は何ですか?
Mladen B.

3

他のSQL実装にも同様の制限があります。その理由は、列を追加するには、その列に値を追加する必要があるためです(物理的にではなくても、論理的に)NULL。デフォルトはです。あなたが許可しない場合はNULL、と持っていないdefault、するつもり値は何ですか?

SQL ServerはをサポートしているためADD CONSTRAINT、null許容列を作成NOT NULLし、NULL値以外の値を入力した後に制約を追加するというPavelのアプローチをお勧めします。


MySQLは、データを含む既存のテーブルへのnull以外の列の追加をサポートします。データ型の「実用的な」空の値が既存の行に提供されます(つまり、浮動小数点数の0.0、整数の0、文字列の空の文字列など)。
Michael Tsang

2

これは私にとってはうまくいきました。デザインビューから「借用」することもでき、変更を加える->右クリック->変更スクリプトを生成します。

BEGIN TRANSACTION
GO
ALTER TABLE dbo.YOURTABLE ADD
    YOURCOLUMN bit NOT NULL CONSTRAINT DF_YOURTABLE_YOURCOLUMN DEFAULT 0
GO
COMMIT


0
Alter TABLE 'TARGET' add 'ShouldAddColumn' Integer Not Null default "0"

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