1085

複数のNULL可能な整数列を含むテーブルがあります。これはいくつかの理由で望ましくないので、すべてのnullを0に更新してからこれらの列をNOT NULL。 nullをからに変更する以外に0データは保存されなければならない。

探しています特定のSQL構文列を変更する(それを呼び出す)ColumnAから)not nullmsgstr "データがnullを含まないように更新されたとします。

を使うSQL Server 2000


  • もう1つ - 列を指定していない既存の挿入に失敗しないようにデフォルトを追加したい場合があります。ALTER TABLE FOO ADD CONSTRAINT FOO_Bar_Default DEFAULT 0 FOR Bar - Marc Gravell
  • また、あなたはそれを知って驚いているかもしれません状況によっては列をに変更するNOT NULL大量のログ記録を引き起こす可能性があります。 - Martin Smith

12 답변


1809

まず、現在のNULL値をすべて消します。

UPDATE [Table] SET [Column]=0 WHERE [Column] IS NULL

次に、テーブル定義を更新してNULLを許可しないようにします。

ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL


  • 上記の2つの正しい回答に付加価値を付けましょう。 NULLの意味はいくつかの意味を持ちます。一般的な意味の1つはUNKNOWNです。例としてSCOREを取ります。ヌルスコアとゼロスコアは違いの世界です!あなたが上記の勧告をする前に。アプリケーションがそのビジネスロジックでnullを受け取らないようにしてください。 - TechTravelThink
  • あなたがタイプミスをしてあなたのDBが爆発した場合に備えて、まずデータベースをバックアップしてください。 - mpen
  • その奇妙なことに、MS SQL Management Studioはそのオプションを許可していません、" Dropping table ..."について自慢しています。 - Sebastian
  • データベースは常にバックアップする必要があります。誰かがUPDATE文またはDELETE文を書いてWHERE句を忘れる可能性があるときには、決してわかりません。 - Daniel Allen Langdon
  • @SebastianGodelet:この警告を無効にしたり、テーブルを変更できないように設定したりできます。場合によっては、テーブルのスキーマを変更するには、新しいテーブルを作成し、古いテーブルからコピーしたデータと古いテーブルからコピーしたデータを削除する必要があります。このプロセスでエラーが発生するとデータが失われる可能性があるため、SSMSは警告を表示し、デフォルトではそれを防ぎます。 - siride

49

私は同じ問題を抱えていましたが、以前はデフォルトでnullを使っていましたが、今度は0をデフォルトにしたいと思います。それにはmdbの解の後にもう1行追加する必要があります。

ALTER TABLE [Table] ADD CONSTRAINT [Constraint] DEFAULT 0 FOR [Column];


  • これで問題が解決することはありません。デフォルトは既に設定されています。変更する必要があるのはNOT NULLです。あなたの答えだけでは、既存のレコードはすべてNULLのままで問題は解決しません。 - PandaWood
  • 「もう1行追加する」の部分を読みましたか。のように、これは上記の答えに追加ですか? - Greg Dougherty
  • 実際には、「もう1行追加する」ことが明確ではありません。 「上記の回答に加えて」という意味(特に「上記」の回答が多数あるため) - それが意味するものであれば、その表現は実際には変更する必要があり、参照する回答の行を含める必要があります。 - PandaWood
  • ただ拘束し、デフォルトを含めて、明示的に制約に名前を付けることをお勧めします。列を削除する必要がある場合は、削除できるようにする前に、削除する制約の名前を知っておく必要があります。私たちのDBマイグレーションでこれを数回実行しました。ここに例が含まれていることは知っていますが、名前が必須ではないため、開発者がつまずく場所です。 - jocull

32

2つのステップでそれをしなければならないでしょう:

  1. 列にNULLが含まれないようにテーブルを更新してください。
UPDATE MyTable SET MyNullableColumn = 0
WHERE MyNullableColumn IS NULL
  1. テーブルを変更して列のプロパティを変更する
ALTER TABLE MyTable
ALTER COLUMN MyNullableColumn MyNullableColumnDatatype NOT NULL


22

Oracle 11gでは、列属性を次のように変更できました。

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

そうでなければabatichevの答えは良さそうだった。この変更を繰り返すことはできません。少なくともSQL Developerでは、列がすでにNULLではないと文句を言われています。


  • Oracle 11では、これを繰り返す必要はないようです。datatype。単にcolumname NOT NULL十分です。見るドキュメント。 - jpmc26

17

これは私のために働いた:

ALTER TABLE [Table] 
Alter COLUMN [Column] VARCHAR(50) not null;


16

列が一意の識別子ではない限り

UPDATE table set columnName = 0 where columnName is null

それから

テーブルを変更してフィールドをnull以外に設定し、デフォルト値の0を指定します。


5

これはもっと簡単に見えますが、Oracle上でのみ動作します。

ALTER TABLE [Table] 
ALTER [Column] NUMBER DEFAULT 0 NOT NULL;

さらに、これを使用して、単に変更するだけでなく、列を追加することもできます。 値がnullの場合、この例ではデフォルト値(0)に更新されます。


  • はい、しかしグーグルはここで人々を指示します。それはそれを引き起こす多くの支持者投票とたくさんの減少者投票を受け取りました。便利だと思います。誰もがこれを無視して構いませんが、私は正直に考え、これが人々を助けているのを見ます。 - csomakk
  • SOの規則を読んでください。良い答えを書くにはどうすればいいですか。技術的な質問に対する回答そして完璧な質問を書く。ノート:無用な回答を削除(または大幅に編集)することを恐れないでください。そして「答えて走ってはいけない」 - Kiquenet

3

私の場合、投稿された回答に問題がありました。私は次のようにしました。

ALTER TABLE table_name CHANGE COLUMN column_name column_name VARCHAR(200) NOT NULL DEFAULT '';

変化するVARCHAR(200)データ型に変更し、オプションでデフォルト値を変更します。

デフォルト値が設定されていない場合は、デフォルト値がnullになり競合が発生するため、この変更を行う際に問題が発生します。


2

の場合FOREIGN KEY CONSTRAINT...主キーテーブルの列に '0'が存在しない場合は問題があります。その解決策は...

ステップ1:

このコードを使用してすべての制約を無効にします。

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

ステップ2:

RUN UPDATE COMMAND (as mentioned in above comments)
RUN ALTER COMMAND (as mentioned in above comments)

STEP3:

このコードを使用してすべての制約を有効にします。

exec sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"


1

カラムをnull以外にしてデフォルトを追加することも、SSMS GUIで実行できます。

  1. 他の人がすでに述べたように、あなたはすべてが終わるまで "nullでない"を設定することはできません。 既存のデータは以下のように "null以外"です。

UPDATE myTable SET myColumn = 0

  1. それが終わったら、デザインビューのテーブルで(右クリック 表をクリックして「デザインビュー」をクリックします。許可する ヌルこんな感じのコラム:

enter image description here

  1. 列が選択された状態のデザインビューでは、列のプロパティ下のウィンドウで次のようにデフォルトを0に設定します。

enter image description here


0

JDK(OracleがサポートしているApache Derbyのディストリビューション)に含まれている作り付けのjavaDBのために、以下が私のために働きました

alter table [table name] alter column [column name] not null;


0

以下のSQLを使用して既存のDB列の定義を変更できます。

ALTER TABLE mytable modify mycolumn datatype NOT NULL;

リンクされた質問


関連する質問

最近の質問