列の変更:nullからnull以外


1217

null可能な整数列がいくつかあるテーブルがあります。これはいくつかの理由で望ましくないため、すべてのnullを0に更新してから、これらの列をに設定しようとしていNOT NULLます。nullを0に変更する以外に、データを保持する必要があります。

列を「」に変更する特定のSQL構文を探しています。nullを含まないようにデータが更新されたと想定します。ColumnAnot null

SQL Server 2000の使用。


16
もう1つ、列を指定しない既存の挿入が失敗しないように、デフォルトを追加することもできます。ALTERTABLE FOO ADD CONSTRAINT FOO_Bar_Default DEFAULT 0 FOR Bar
Marc Gravell

4
また、状況によっては、列を変更しNOT NULLて大量のログを記録する可能性があることを知って驚くかもしれません。
マーティン・スミス

回答:


2012

まず、現在のNULL値をすべて非表示にします。

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

次に、テーブル定義を更新して「NULL」を禁止します。

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

49
上記の2つの正しい回答に付加価値を付けましょう。NULLのセマンティクスにはいくつかの意味があります。一般的な意味の1つは不明です。例としてSCOREを取り上げます。ヌルスコアとゼロスコアは違いの世界です!上記の推奨事項を行う前。アプリケーションがそのビジネスロジックでnullをとらないようにしてください。
TechTravelThink 2009年

242
タイプミスをしてDBが爆発した場合に備えて、まずデータベースをバックアップします。
mpen

20
奇妙なことに、MS SQL Management Studioはそのオプションを許可せず、「テーブルを削除しています...」について自慢します
Sebastian

14
データベースは常にバックアップする必要があります。誰かがいつUPDATEまたはDELETEステートメントを書いて、WHERE句を忘れるかわからない。
ビビアンリバー

2
@SebastianGodelet:この警告をオフにしたり、テーブルの変更を妨げないようにする設定があります。場合によっては、テーブルのスキーマを変更するために、新しいテーブルを作成し、古いテーブルからデータをコピーし、古いテーブルを削除する必要があります。このプロセスでエラーが発生するとデータが失われる可能性があるため、SSMSは警告を表示し、デフォルトではそれを実行できません。
siride 2015年

57

同じ問題がありましたが、フィールドはデフォルトでnullに設定されていましたが、今ではデフォルトで0に設定したいと思います。mdbのソリューションの後に1行追加する必要がありました。

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

これは問題に答えません。デフォルトはすでに設定されています。変更する必要があるのはNOT NULLです。あなたの答えだけで、すべての既存のレコードはNULLのままになり、問題は残ります。
PandaWood 2015

6
「もう1行追加する」の部分を読みましたか?のように、これは上記の答えに追加されていますか?
Greg Dougherty、2015

7
実際には、「1行以上追加する」が「上記の回答に加えて」を意味することは明らかではありません(特に「上記」の回答が多いため)-それが意図したものである場合、表現は実際に変更する必要があり、参照する回答の行を含める
PandaWood 2015

2
デフォルトを含め、制約に明示的に名前を付けることをお勧めします。列を削除する必要がある場合は、削除する前に、削除する制約の名前を知っておく必要があります。DBマイグレーションでこれに数回遭遇しました。ここに例が含まれていることは知っていますが、名前が必要ないため、一部の開発者がトリップする場所です。
jocull

38

次の2つの手順で行う必要があります。

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

27

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

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

そうでなければ、アバチチェフの答えは良さそうだった。変更を繰り返すことはできません-(少なくともSQL Developerでは)列が既にnullではないというメッセージが表示されます。


Oracle 11では、を繰り返す必要はないようdatatypeです。ただcolumname NOT NULL十分です。ドキュメントを参照してください。
jpmc26


16

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

UPDATE table set columnName = 0 where columnName is null

その後

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


4

これはより単純に見えますが、Oracleでのみ機能します。

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

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


はい、しかしグーグルはここに人々を向けます。重宝すると思います。誰もがこれを無視することは自由ですが、私は正直に考えて、これが人々を助けることを理解しています。
csomakk

SOルールを読んでください。良い答えを書くにはどうすればよいですか?技術的な質問に素早く答え、完璧な質問書いてください。注:Doが(重くまたは編集)役に立たない答えを削除することを恐れてはいけないしない「の回答と実行
Kiquenet

4

の場合には 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"

4

私の場合、投稿された回答に問題がありました。私は以下を使用することになりました:

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

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

デフォルト値がない場合、デフォルトはnullで競合が発生するため、この変更を行うと問題が発生します。


1

例を見てみましょう:

TABLE NAME=EMPLOYEE

EMPLOYEE_NAMEをに変更しますNOT NULL。このクエリは、タスクに使用できます。

ALTER TABLE EMPLOYEE MODIFY EMPLOYEE.EMPLOYEE_NAME datatype NOT NULL;

投稿を読みやすくするために、怒鳴らずに書式設定を使用してください。たとえば、コード部分の認識に役立ちます。stackoverflow.com/editing-help
ユンノシュ

また、すべて大文字で長いテキストを書かないでください。インターネット上で叫んでいると見なされます
Zoe

1
@PawanTiwariは完全に編集してください。投稿のすべての問題を修正していないようです。そのほとんどが資本化されています。
ダブルビープ音

@ double-beep、確かにそれを覚えておきます。ありがとう
Pawan Tiwari

フォーマットの問題とは別に、たとえばRalph Wiggum、JDM、Rashmi Singh、trooper31による以前の回答と比較して、回答が提供する追加の洞察をより明確にしてください。そのため、ソリューションの細かい点を指摘する必要があるようです。回答をコピーするだけの印象を避けてください...
ユンノシュ

0

JDK(OracleがサポートするApache Derbyのディストリビューション)に含まれている組み込みのjavaDBの場合、以下が機能しました

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

0

列をnull以外にし、デフォルトを追加することも、SSMS GUIで行うことができます。

  1. 他の人がすでに述べたように、次のように既存のデータがすべて「nullでない」まで、「nullでない」を設定することはできません。

UPDATE myTable SET myColumn = 0

  1. これが完了したら、テーブルをデザインビュー(テーブルを右クリックして[デザインビュー]をクリック)で、次のように[Nullを許可]列をオフにします。

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

  1. 列が選択されたデザインビューで、下のウィンドウに列のプロパティが表示され、そこでデフォルトを0に設定することもできます 。

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


反対票が表示されますが、フィードバックがなければ何も修正できません。うまくいかなかった場合はお知らせください。
トニーL.

-1

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

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