PostgreSQLでALTER TABLEで追加したカラムをnot nullにしたい! SQL超初心者の勉強

2020-04-05

既に作成したテーブルに対して新たにカラム(列名)を追加する時にはALTER TABLEを使ってカラムを追加することができますが、CREATE TABLE の時のようにデータ型の後ろにnot null(非NULL制約)をつけてもエラーとなってしまいました。

検証環境

PostgreSQL 9.6

エラーとなったALTER TABLE

ALTER TABLE testTable ADD COLUMN itemNo INTEGER not null;

エラー文

ERROR: column "itemno" contains null values

原因としてはALTER TABLEで作られたカラムの値がnullになっているために発生しました。

カラム1カラム2追加したカラム
11null

考察

すでにいくつか値の入ったデータ(行数)を持っている場合、追加したカラムの中身がnullとなってしまいます。
ALTER TABLEでカラムを追加した際にはnull判定がただちに行われるため、そのあとにupdate文で更新しても手遅れでした。
そのためCreate teble後にすぐ(行数がない)にAlter tableでカラムを追加する場合は上記の方法でnot nullをデータ型に指定して追加してもエラーとはなりません。

解決策.ver の ALTER TABLE

-- カラムを追加
ALTER TABLE testTable ADD COLUMN itemNo INTEGER;

-- 追加したカラムへ値を入れる
update testTable set itemNo = 1;


-- カラムitemNoに対してnot nullを設定
ALTER TABLE testTable ALTER COLUMN itemNo SET NOT NULL;

まず新しいカラムを作成し、追加した新しいカラムの項目に対して値をいれnull状態から逃げます。
その後「ALTER TABLE テーブル名 ALTER COLUMN カラム名 SET NOT NULL」でカラムに対してnot null を設定します。

以上でnot nullを設定することができました。

参考サイト:PostgreSQL 9.6.5文書 5.5. テーブルの変更

PostgreSQL, SQL

Posted by Nakamoto