PostgreSQL で Not Null 制約を削除

Bilal Shahid 2023年6月20日
  1. NOT NULL 制約を使用することの重要性
  2. PostgreSQL で Not Null 制約を適用する
  3. PostgreSQL で Not Null 制約を削除
PostgreSQL で Not Null 制約を削除

NOT NULL 制約は、PostgreSQL で非常に役立つツールです。 ただし、少し使いにくいかもしれません。 この記事では、データベースで目的の結果を得るために適用および削除する方法について説明します。

NOT NULL 制約を使用することの重要性

制約は、テーブル内の列に適用される事前設定ルールとして定義できるため、列に入力されたデータが要件に適合します。

特に複数の関係を持つ大規模なデータベースに大量のデータがある場合、大きな問題になりがちな無効なデータ入力を防ぐことができます。 制約をいくつでも適用することも、まったく適用しないこともできます。

NOT NULL 制約は、テーブルの任意の列に追加できる特定の制約です。 名前が示すように、その列の各行のエントリが NULL にならないようにします。

NULL になることのない PRIMARY キーを扱う場合は特に重要です。 NULL 値が関係している場合、関係を作成できないか、正しく行われないことが多いため、関係を確立するときにも必要です。

また、ユーザーが誤ってエントリをスキップするのを防ぎます。 それでは、PostgreSQL で NOT NULL 制約を適用する方法を学びましょう。

PostgreSQL で Not Null 制約を適用する

NOT NULL 制約を適用することは、思ったほど難しくありません。 ほとんどの場合、これは追加のコード行にすぎません。 状況に応じて、次のいずれかの方法を使用できます。

テーブルの作成中に NOT NULL 制約を追加する

NOT NULL 制約を列に追加する最適なタイミングは、作成時です。 これは、次のように NOT NULL を追加するだけだからです。

CREATE TABLE name(
    column_1 int PRIMARY KEY,
    column_2 VARCHAR (100),
    column_3 VARCHAR (300) NOT NULL
);

ここでは、NOT NULL 制約が column_3 に追加されています。

NOT NULL 制約を既存のテーブルに追加する

PostgreSQL の使用を容易にする多くのことの 1つは、テーブルが既に作成されている場合でも、いつでも追加の制約を追加できる方法です。 次のコードを使用してこれを試すことができます。

まず、テーブルを作成します。

CREATE TABLE users(
    user_id int PRIMARY KEY,
    user_name VARCHAR (100) UNIQUE,
    "e-mail" VARCHAR (300)
);

テーブルが作成されます。 ただし、NOT NULL 制約を追加するのを忘れたことに気付いた場合は、2つの方法でこれを行うことができます。 最初のものはもう少し作業が必要です。 次に示すように、最初に既存のテーブルを削除して、新しいテーブルを作成します。

DROP TABLE users;

この後、以下に示すように、not null 制約を使用してテーブルを再度作成します。

CREATE TABLE users(
    user_id int PRIMARY KEY,
    user_name VARCHAR (100) UNIQUE,
    "e-mail" VARCHAR (300) NOT NULL
);

この方法は機能しますが、少し時間がかかります。 はるかに簡単な代替手段は、以下に示すように ALTER TABLE コマンドを使用することです。

ALTER TABLE users 
ALTER COLUMN "e-mail" set not null;

このようにして、NOT NULL 制約が e-mail 列に追加されます。 さらに、このためにテーブルを削除する必要はありません。

PostgreSQL で Not Null 制約を削除

データベースを編集しているときに、NOT NULL 制約が不要であるか、間違って配置されていることに気付くかもしれません。 このような場合、NOT NULL 制約を削除または削除する方法を知る必要があります。 以下にいくつかの方法を示します。

個々の列で NOT NULL 制約を削除する

個々の列の制約を削除したい場合は、同じ ALTER TABLE コマンドを使用して簡単に削除できますが、ここで制約を削除するため、わずかな違いがあります。 以下のコードを使用してこれを実現できます。

ALTER TABLE users
ALTER COLUMN "e-mail" drop not null;

e-mail 列の Postgres NOT NULL 制約をすばやく削除できます。 これは、テーブル全体を削除して、必要な列に NOT NULL 制約を追加せずに再度作成するよりも優れた代替手段です。

複数の列で NOT NULL 制約を削除する

さまざまな列で制約を削除する場合は、上記のコードを複数回使用できます。

ALTER TABLE users
ALTER COLUMN "e-mail" drop not null;

ALTER TABLE users
ALTER COLUMN new_column drop not null;

ただし、これには少し時間がかかる場合があります。 幸いなことに、PostgreSQL は、次のように NOT NULL を削除するために使用できる代替手段を提供しています。

ALTER TABLE users
ALTER COLUMN "e-mail" drop not null,
ALTER COLUMN new_column drop not null;

このようにして、複数の列の NOT NULL 制約を一度に削除できます。

PostgreSQL ですべての Not Null 制約を削除

上記の方法は、変更が必要な列があまりない場合に役立ちます。 ただし、多くの列を含むテーブルからすべての NOT NULL 制約を削除する場合、必要なすべての列を特定するのは難しい場合があります。

そのために、以下のコードを使用できます。

SELECT x.attname
FROM pg_catalog.pg_attribute x
WHERE attrelid = 'users'::regclass
AND x.attnum > 0
AND NOT x.attisdropped
AND x.attnotnull;

NOT NULL 制約ですべての列を除外します。 ただし、これには PRIMARY キーも含まれるため、要件によっては除外することもできます。

この後、上記のコードを使用して、必要なすべての列の制約を削除します。 これは、テーブルの列に NOT NULL 制約を追加および削除するために PostgreSQL が提供する簡単な方法です。

著者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub