CREATE UNIQUE TABLE を使用して PostgreSQL テーブルに UNIQUE 制約を追加する方法
PostgreSQL テーブルに後から UNIQUE 制約を追加する方法
方法 1: ALTER TABLE を使用
ALTER TABLE テーブル名 ADD CONSTRAINT 制約名 UNIQUE (列名);
例:
ALTER TABLE users ADD CONSTRAINT unique_email UNIQUE (email);
この方法は、既存のテーブルに UNIQUE 制約を追加する最も簡単な方法です。
方法 2: CREATE INDEX を使用
CREATE UNIQUE INDEX 制約名 ON テーブル名 (列名);
CREATE UNIQUE INDEX unique_email ON users (email);
この方法は、UNIQUE 制約と同時にインデックスを作成したい場合に便利です。
どちらの方法でも、PostgreSQL テーブルに後から UNIQUE 制約を追加することができます。ただし、一般的には ALTER TABLE を使用する方法の方が推奨されます。
理由は以下の通りです。
- ALTER TABLE を使用すると、UNIQUE 制約と同時にインデックスが自動的に作成されます。
- ALTER TABLE を使用すると、制約名に分かりやすい名前を付けることができます。
注意事項
- UNIQUE 制約を追加する前に、テーブルに重複データがないことを確認する必要があります。
補足
- UNIQUE 制約は、テーブル内の各列の値がユニークであることを保証します。
- NULL 値は、UNIQUE 制約の評価において他の値とは異なる値として扱われます。
- 複数の列に UNIQUE 制約を適用したい場合は、列名をカンマで区切って指定します。
例
-- テーブル作成
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
-- UNIQUE 制約追加
ALTER TABLE users ADD CONSTRAINT unique_email UNIQUE (email);
-- データ挿入
INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]');
INSERT INTO users (name, email) VALUES ('Jane Doe', '[email protected]');
-- 重複データ挿入エラー
INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]');
上記の例では、users
テーブルに email
列に UNIQUE 制約を追加しています。 3 番目の INSERT ステートメントは、email
列に重複データが挿入されるため、エラーが発生します。
-- テーブル作成
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
-- UNIQUE 制約追加 (ALTER TABLE を使用)
ALTER TABLE users ADD CONSTRAINT unique_email UNIQUE (email);
-- UNIQUE 制約追加 (CREATE INDEX を使用)
CREATE UNIQUE INDEX unique_email ON users (email);
-- データ挿入
INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]');
INSERT INTO users (name, email) VALUES ('Jane Doe', '[email protected]');
-- 重複データ挿入エラー
INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]');
- 上記のコードは、
users
テーブルという名前のテーブルを作成します。 - このテーブルには、
id
、name
、email
という 3 つの列があります。 id
列は主キーであり、name
およびemail
列は NOT NULL 制約を持っています。email
列には、UNIQUE 制約が追加されています。- 最後の 3 つの INSERT ステートメントは、
users
テーブルにデータ挿入します。 - 3 番目の INSERT ステートメントは、
email
列に重複データが挿入されるため、エラーが発生します。
実行方法
- PostgreSQL サーバを起動します。
- psql コマンドラインツールを開きます。
- 上記のコードを psql コマンドラインツールに貼り付けます。
- Enter キーを押します。
出力結果
CREATE TABLE
ALTER TABLE
INSERT 0 1
INSERT 0 1
ERROR: duplicate key value violates unique constraint "unique_email"
DETAIL: Key (email)=([email protected]) already exists.
補足
- 上記のコードは、PostgreSQL 14.5 で動作確認しています。
- コードを実行する前に、PostgreSQL サーバと psql コマンドラインツールがインストールされていることを確認してください。
PostgreSQL テーブルに UNIQUE 制約を追加するその他の方法
CREATE UNIQUE TABLE 新しいテーブル名 (
列名 型,
...
);
INSERT INTO 新しいテーブル名 SELECT * FROM 既存テーブル名;
CREATE UNIQUE TABLE unique_users (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE
);
INSERT INTO unique_users SELECT * FROM users;
この方法は、既存のテーブルから新しいテーブルを作成し、その新しいテーブルに UNIQUE 制約を適用する方法です。
方法 4: COPY と UNIQUE を使用
COPY 新しいテーブル名 (列名, ...) FROM 既存テーブル名 WITH UNIQUE;
COPY unique_users (id, name, email) FROM users WITH UNIQUE;
- 既存のテーブルに少量のデータしかない場合は、ALTER TABLE を使用するのが最も簡単です。
- 既存のテーブルに大量のデータがある場合は、CREATE UNIQUE TABLE または COPY を使用するのが効率的です。
sql database postgresql