はじめに
PostgreSQLおよびその他のリレーショナルデータベース管理システムは、データベースを使用します およびテーブル データを構造化して整理します。これら2つの用語の定義をすばやく確認できます:
- データベース: 構造とデータの異なるセットを互いに分離する
- テーブル: データ構造を定義し、実際のデータ値をデータベース内に保存します
PostgreSQLには、データベースとテーブルの間に schemaと呼ばれる中間オブジェクトもあります。 :
- スキーマ: テーブル、インデックス、ビュー、およびその他のアイテムを含むデータベース内の名前空間。
このガイドでは、PostgreSQLのスキーマの概念を直接扱うことはしませんが、そこにあることを知っておくとよいでしょう。
代わりに、PostgreSQLデータベースとテーブルを作成および破棄する方法に焦点を当てます。例では主にSQLを使用しますが、最後に、コマンドラインを使用してこれらのタスクのいくつかを実行する方法を示します。これらの代替手段は、PostgreSQLホストへの管理アクセス権がある場合に使用できる標準のPostgreSQLインストールに含まれているツールを使用します。
このガイドで説明されているステートメントの一部、特にPostgreSQLの CREATE TABLE ステートメントには、この記事の範囲外であった多くの追加オプションがあります。追加情報が必要な場合は、PostgreSQLの公式ドキュメントを確認して詳細を確認してください。
前提条件
このガイドに従うには、 psql を使用して、管理者権限を持つユーザーでPostgreSQLインスタンスにログインする必要があります。 コマンドラインクライアント。 PostgreSQLインスタンスは、ローカル、リモート、またはプロバイダーによってプロビジョニングできます。
具体的には、PostgreSQLユーザーには CREATE DBが必要です。 特権またはスーパーユーザーになる 、 \ duで確認できます psqlのメタコマンド :
\du
List of roles Role name | Attributes | Member of-----------+------------------------------------------------------------+----------- postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
postgres インストール時に自動的に作成されるスーパーユーザーには必要な権限がありますが、 Create DBを使用して任意のユーザーを使用できます 特権。
新しいデータベースを作成する
psqlを使用してPostgreSQLインスタンスに接続したら または他のSQLクライアントの場合、SQLを使用してデータベースを作成できます。
データベースを作成するための基本的な構文は次のとおりです。
CREATE DATABASE db_name;
これにより、 db_nameというデータベースが作成されます デフォルトのデータベース設定を使用して、現在のユーザーが新しいデータベースの所有者として設定されている現在のサーバー上。デフォルトのtemplate1のプロパティを表示できます 次のpsqlを使用したテンプレート メタコマンド:
\l template1
List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges-----------+----------+----------+-------------+-------------+----------------------- template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres(1 row)
追加のパラメーターを追加して、データベースの作成方法を変更できます。これらはいくつかの一般的なオプションです:
- エンコーディング: データベースの文字エンコードを設定します。
- LC_COLLATE: 照合を設定します 、または並べ替え、データベースの順序。これは、アイテムが注文されたときにどのように整理されるかを決定するローカリゼーションオプションです。
- LC_CTYPE: 新しいデータベースの文字分類を設定します。これは、大文字、小文字、数字と見なされる文字に影響を与えるローカリゼーションオプションです。
これらは、データベースがサポートする予定の形式で、プロジェクトのローカリゼーション設定でデータを確実に保存できるようにするのに役立ちます。
たとえば、データベースがUnicodeサポートで作成されていることを確認し、サーバー自体のロケールをオーバーライドしてアメリカ英語のローカリゼーションを使用する場合(これらはすべて template1の値と一致します。 上に示したように、実際には変更は発生しません)、次のように入力できます:
CREATE DATABASE db_name ENCODING 'UTF8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';
このガイドの例に従うには、 schoolというデータベースを作成します インスタンスのデフォルトのロケール設定とUTF8文字エンコードを使用する:
CREATE DATABASE school ENCODING 'UTF8';
これにより、指定した仕様を使用して新しいデータベースが作成されます。
既存のデータベースを一覧表示
サーバーまたはクラスターで現在使用可能なデータベースを判別するには、次のSQLステートメントを使用できます。
SELECT datname FROM pg_database;
これにより、環境内で現在定義されている各データベースが一覧表示されます。
datname----------- _dodb template1 template0 defaultdb school(5 rows)
前述のように、 psqlを使用して接続している場合 クライアントの場合、この情報を取得することもできます \ l メタコマンド:
\l
これにより、使用可能なデータベース名が、所有者、エンコーディング、ロケール設定、および特権とともに表示されます。
List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges-----------+----------+----------+-------------+-------------+----------------------- _dodb | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | defaultdb | doadmin | UTF8 | en_US.UTF-8 | en_US.UTF-8 | school | doadmin | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres(5 rows)
学校 作成したデータベースは、システム上の他のデータベースの中に表示されます。これは、サーバーまたはクラスター内のデータベースの概要を把握するための良い方法です。
データベース内にテーブルを作成する
1つ以上のデータベースを作成した後、データを格納するためのテーブルの定義を開始できます。テーブルは、名前と、各レコードに含める必要のあるフィールドとデータ型を決定する定義済みのスキーマで構成されています。
PostgreSQL CREATE TABLE 構文
CREATE TABLEを使用してテーブルを作成できます 声明。コマンドの簡略化された基本構文は次のようになります。
CREATE TABLE table_name ( column_name TYPE [column_constraint], [table_constraint,]);
上記の構文のコンポーネントには、次のものが含まれます。
-
CREATE TABLE table_name:テーブルを定義することを通知する基本的な作成ステートメント。table_nameプレースホルダーは、使用するテーブルの名前に置き換える必要があります。 -
column_name TYPE:テーブル内の基本列を定義します。column_nameプレースホルダーは、列に使用する名前に置き換える必要があります。TYPE列のPostgreSQLデータ型を指定します。テーブル内に格納されるデータは、受け入れられる列構造と列データ型に準拠している必要があります。 -
column_constraint:列の制約は、列に格納できるデータにさらに制限を追加するためのオプションの制約です。たとえば、エントリがnull、一意、または正の整数でないことを要求できます。 -
table_constraints:テーブルの制約は列の制約に似ていますが、複数の列の相互作用が含まれます。たとえば、DATE_OF_BIRTHをチェックするテーブル制約を設定できます。DATE_OF_DEATHの前です テーブルで。
IF NOT EXISTSを使用して条件付きでテーブルを作成します 条項
デフォルトでは、データベース内にすでに存在するPostgreSQLでテーブルを作成しようとすると、エラーが発生します。テーブルが存在しない場合にテーブルを作成したいが、テーブルがすでに存在する場合は続行する場合にこの問題を回避するには、 IF NOT EXISTSを使用できます。 句。 IF NOT EXISTS データベースがすでに存在する場合にステートメントを無視するようにPostgreSQLに指示するオプションの修飾子。
IF NOT EXISTSを使用するには 句、 CREATE TABLEの後にコマンドに挿入します 構文およびテーブル名の前:
CREATE TABLE IF NOT EXISTS table_name ( column_name TYPE [column_constraint], [table_constraint,]);
このバリアントは、テーブルの作成を試みます。その名前のテーブルが指定されたデータベース内にすでに存在する場合、PostgreSQLは、エラーで失敗するのではなく、テーブル名がすでに取得されていることを示す警告をスローします。
PostgreSQLでテーブルを作成する方法
上記の構文は、基本的なテーブルを作成するのに十分です。例として、 school内に2つのテーブルを作成します データベース。 1つのテーブルはsuppliesと呼ばれます もう1人はteachersと呼ばれます :
supply テーブルには、次のフィールドが必要です:
- ID: 学用品の種類ごとに一意のID。
- 名前: 特定の学校のアイテムの名前。
- 説明: アイテムの簡単な説明。
- メーカー: アイテムメーカーの名前。
- 色: アイテムの色。
- 在庫: 特定の種類の学校用品のために私たちが持っているアイテムの数。これは0未満であってはなりません。
supplyを作成できます 次のSQLを使用した上記の品質のテーブル。
まず、 schoolに変更します psqlで作成したデータベース 次のように入力します:
\c school
これにより、将来のコマンドが対象とするデータベースが変更されます。データベースを反映するようにプロンプトが変更されます。
次に、 supplyを作成します 次のステートメントを含むテーブル:
CREATE TABLE supplies ( id INT PRIMARY KEY, name VARCHAR, description VARCHAR, manufacturer VARCHAR, color VARCHAR, inventory int CHECK (inventory > 0));
これにより、 supplyが作成されます school内のテーブル データベース。 PRIMARY KEY 列制約は、テーブル内のレコードを一意に識別できる列を示すために使用される特別な制約です。そのため、制約は、列をnullにすることはできず、一意である必要があることを指定します。 PostgreSQLは、クエリ速度を上げるために主キー列のインデックスを作成します。
次のように入力して、新しいテーブルが存在することを確認します。
\dt
List of relations Schema | Name | Type | Owner --------+----------+-------+--------- public | supplies | table | doadmin(1 row)
次のように入力して、スキーマが目的の設計を反映していることを確認します。
\d supplies
Table "public.supplies" Column | Type | Collation | Nullable | Default--------------+-------------------+-----------+----------+--------- id | integer | | not null | name | character varying | | | description | character varying | | | manufacturer | character varying | | | color | character varying | | | inventory | integer | | |Indexes: "supplies_pkey" PRIMARY KEY, btree (id)Check constraints: "supplies_inventory_check" CHECK (inventory > 0)
指定した各列とデータ型を確認できます。 Inventoryに対して定義した列制約 列は最後に表示されます。
次に、 Teachersを作成します テーブル。この表には、次の列が表示されている必要があります。
- 従業員ID :一意の従業員識別番号。
- 名 :先生の名。
- 姓 :先生の名前。
- 件名 :教師が教えるために雇われている主題。
- グレードレベル :教えるために雇われている生徒の学年レベル。
Teachersを作成します 次のSQLを使用した上記のスキーマのテーブル:
CREATE TABLE teachers ( id INT PRIMARY KEY, first_name VARCHAR, last_name VARCHAR, subject VARCHAR, grade_level int);
主キーと外部キーを使用してテーブルを作成する方法
主キーと外部キーを使用したテーブルの作成に関する情報は、他のPostgreSQLガイドの一部にあります。主キーと外部キーはどちらもPostgreSQL内のデータベース制約のタイプです。
主キーは、同じテーブル内の行全体で一意であることが保証されている特別な列です。すべての主キーを使用して、特定の行を一意に識別できます。主キーは、各行が主キー列に対して一意の値を持つことを保証するだけでなく、行に NULLが含まれないことも保証します。 その列の値。多くの場合、PostgreSQLの主キーは、次の形式を使用して、自動的に割り当てられる増分主キーを指定します。 id SERIAL PRIMARY KEY 。
外部キーは、あるテーブルの1つまたは複数の列が別のテーブルに含まれる値と一致することを保証する方法です。これにより、テーブル間の参照整合性が確保されます。
PostgreSQLでテーブルを表示する方法
PostgreSQLでは、探している情報に応じて、いくつかの異なる方法でテーブルを一覧表示できます。
データベース内で使用可能なテーブルを確認したい場合は、 \ dtを使用できます。 psqlに含まれているメタコマンド 上で示したように、すべてのテーブルを一覧表示するクライアント:
\dt
List of relations Schema | Name | Type | Owner--------+----------+-------+--------- public | supplies | table | doadmin public | teachers | table | doadmin(2 rows)
テーブルのスキーマが仕様と一致していることを確認することもできます:
\d teachers
Table "public.teachers" Column | Type | Collation | Nullable | Default-------------+-------------------+-----------+----------+--------- id | integer | | not null | first_name | character varying | | | last_name | character varying | | | subject | character varying | | | grade_level | integer | | |Indexes: "teachers_pkey" PRIMARY KEY, btree (id)
教師コード> テーブルは私たちの定義と一致しているようです。
テーブルを変更する
PostgreSQLの既存のテーブルのスキーマを変更する必要がある場合は、 ALTER TABLEを使用できます。 指図。 ALTER TABLE コマンドはCREATETABLEと非常によく似ています コマンドですが、既存のテーブルで動作します。
テーブル構文を変更する
PostgreSQLでテーブルを変更するための基本的な構文は次のようになります。
ALTER TABLE <table_name> <change_command> <change_parameters>
テーブルにさまざまなオプションを設定する、列を追加または削除する、タイプや制約を変更するなど、必要な変更の正確なタイプを示します。 コマンドの一部には、PostgreSQLが変更を完了するために必要な追加情報が含まれています。
テーブルへの列の追加
ADD COLUMN を使用して、PostgreSQLテーブルに列を追加できます。 コマンドを変更します。変更パラメータには、 CREATE TABLE で指定するのと同じように、列名、タイプ、およびオプションが含まれます。 コマンド。
たとえば、 missing_columnという列を追加するには textの some_tableというテーブルに入力します 、次のように入力します:
ALTER TABLE some_table ADD COLUMN missing_column text;
テーブルからの列の削除
代わりに、既存の列を削除する場合は、 DROP COLUMNを使用できます。 代わりにコマンド。ドロップする列の名前を変更パラメーターとして指定する必要があります:
ALTER TABLE some_table DROP COLUMN useless_column;
列のデータ型を変更する
PostgreSQLが特定の列に使用するデータ型を変更するには、 ALTER COLUMNを使用できます。 SET DATA TYPEを使用してコマンドを変更します 列コマンド。パラメータには、列名、その新しいタイプ、およびオプションの USINGが含まれます。 古いタイプを新しいタイプに変換する方法を指定する句。
たとえば、 idの値を設定するには residentの列 intへのテーブル 明示的なキャストを使用して、次のように入力できます。
ALTER TABLE resident ALTER COLUMN id SET DATA TYPE int USING id::int;
その他のテーブルの変更
ALTER TABLE を使用すると、他の多くの種類の変更を行うことができます。 指図。使用可能なオプションの詳細については、 ALTER TABLEのPostgreSQLの公式ドキュメントを確認してください。 。
テーブルを削除する
テーブルを削除する場合は、 DROP TABLEを使用できます。 SQLステートメント。これにより、テーブルとその中に保存されているデータが削除されます。
基本的な構文は次のようになります:
DROP TABLE table_name;
これにより、テーブルが存在する場合は削除され、テーブル名が存在しない場合はエラーがスローされます。
テーブルが存在する場合は削除し、存在しない場合は何もしない場合は、 IF EXISTSを含めることができます。 ステートメント内の修飾子:
DROP TABLE IF EXISTS table_name;
他のテーブルまたはオブジェクトに依存関係があるテーブルは、それらの依存関係が存在する間はデフォルトで削除できません。エラーを回避するために、オプションで CASCADEを含めることができます パラメータ。テーブルとともに依存関係を自動的に削除します:
DROP TABLE table_name CASCADE;
テーブルに外部キーがある場合 削除するテーブルを参照する制約。その制約は自動的に削除されます。
supplyを削除します 次のように入力して以前に作成したテーブル:
DROP TABLE supplies;
Teachersを維持します データベースを削除するステートメントがテーブルなどのすべての子オブジェクトも削除することを示すデータベース。
データベースを削除する
DROP DATABASE ステートメントは、指定されたデータベースを削除するようにPostgreSQLに指示します。基本的な構文は次のようになります:
DROP DATABASE database_name;
database_nameを置き換えます 削除するデータベースの名前を持つプレースホルダー。これにより、データベースが見つかった場合は削除されます。データベースが見つからない場合、エラーが発生します:
DROP DATABASE some_database;
ERROR: database "some_database" does not exist
データベースが存在する場合は削除し、それ以外の場合は何もしない場合は、オプションの IF EXISTSを含めます。 オプション:
DROP DATABASE IF EXISTS some_database;
NOTICE: database "some_database" does not exist, skippingDROP DATABASE
これにより、データベースが削除されるか、データベースが見つからない場合は何も実行されません。
schoolを削除するには このガイドで使用したデータベースについては、システム上の既存のデータベースを一覧表示してください。
\l
List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges-----------+----------+----------+-------------+-------------+----------------------- _dodb | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | defaultdb | doadmin | UTF8 | en_US.UTF-8 | en_US.UTF-8 | school | doadmin | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres(5 rows)
削除したくないデータベースの1つへの新しい接続を開きます:
\c defaultdb
新しい接続が開いたら、 schoolを削除します 次のコマンドを使用したデータベース:
DROP DATABASE school;
これにより、 schoolが削除されます Teachersと一緒にデータベース 内で定義されたテーブル。
SQLの使用を続けている場合は、ここで終了するか、結論にスキップできます。コマンドラインからデータベースを作成および削除する方法について知りたい場合は、次のセクションに進んでください。
管理コマンドラインツールを使用したデータベースの作成と削除
PostgreSQLがインストールされているサーバーまたはクラスターへのシェルアクセスがある場合は、データベースの作成と削除に役立ついくつかの追加のコマンドラインツールにアクセスできる場合があります。 createdb およびdropdb コマンドは、インストール時にPostgreSQLにバンドルされています。
コマンドラインから新しいデータベースを作成します
createdbの基本的な構文 コマンド(PostgreSQLへの管理者アクセス権を持つシステムユーザーが実行する必要があります)は次のとおりです。
createdb db_name
これにより、 db_nameというデータベースが作成されます デフォルト設定を使用してPostgreSQL内で。
このコマンドは、前に見たSQLバリアントと同様に、動作を変更するオプションも受け入れます。これらのオプションの詳細については、 man createdbをご覧ください。 。最も重要なオプションのいくつかは次のとおりです。
-
-encoding =:データベースの文字エンコードを設定します。 -
-locale =:データベースのロケールを設定します。
これらは、データベースがサポートする予定の形式で、プロジェクトのローカリゼーション設定でデータを確実に保存できるようにするのに役立ちます。
たとえば、データベースがUnicodeサポートで作成されていることを確認し、サーバー自体のロケールをオーバーライドしてアメリカ英語のローカリゼーションを使用するには、次のように入力します。
createdb --encoding=UTF8 --locale=en_US db_name
適切な権限がある場合、データベースは仕様に従って作成されます。
このガイドの例に従うために、 schoolというデータベースを作成できます。 次のように入力して、デフォルトのロケールとUTF8文字エンコードを使用します。
createdb --encoding=UTF8 school
次に、 psqlを使用してデータベースに接続できます。 いつものようにテーブルを設定します。
コマンドラインからデータベースを削除します
dropdb コマンドはDROPDATABASEをミラーリングします SQLステートメント。基本的な構文は次のとおりです。
dropdb database_name
database_nameを変更します 削除するデータベースを参照するプレースホルダー。
デフォルトでは、指定されたデータベースが見つからない場合、このコマンドはエラーになります。これを回避するには、オプションの --if-existsを含めることができます フラグ:
dropdb --if-exists database_name
これにより、指定されたデータベースが存在する場合は削除されます。それ以外の場合は、何もしません。
schoolを削除するには 以前に作成したデータベース、次のように入力します:
dropdb school
これにより、データベースと、テーブルなどの子要素が削除されます。
結論
この記事では、PostgreSQL内でデータベースとテーブルを作成および削除する方法の基本について説明しました。これらは、データベースシステムをセットアップし、データの構造を定義するために必要な最も基本的なコマンドの一部です。
前述のように、このPostgreSQLチュートリアルでカバーされているSQLステートメント、特に CREATE TABLE ステートメント、PostgreSQLの動作を変更するために使用できる多くの追加パラメータがあります。これらの詳細については、PostgreSQLの公式ドキュメントをご覧ください。