DDL(Data Definition Language)

DDLはデータ定義言語で、データベース(Database)・テーブル(Table)・インデックス(Index)・ロール(Role)・ビュー(View)などの作成(CREATE)・変更(ALTER)・削除(DROP)を行います。
オプションについては一部記載していますので、詳細はPostgreSQLのマニュアルを参照してください。

ユーザ

PostgreSQLで使用するユーザーを管理します。
PostgreSQLをインストールすると、「postgres」ユーザーが既に存在しています。
このサイトではそのユーザーを使用しますが、ユーザーを作成したり変更するなど管理する場合は「CREATE USER」や「ALTER USER」や「DROP USER」コマンドを使用します。

本サイトでは、「postgres」ユーザーをそのまま利用します。
そのため、ALTERでパスワードのみ変更します。

#「postgres」のユーザを作成
!sudo -u postgres psql -U postgres -c "ALTER USER postgres PASSWORD 'postgres';"

データベース

PostgreSQLで使用するデータベースを管理します。
PostgresSQLでは、新規・既存のデータベースをテンプレート化してコピーすることができます。
データベース作成時に共通で使用したい関数などがあり、それを使用する場合にはテンプレート化します。

テンプレートには、template0とtemplate1があり、デフォルトではtemplate1がテンプレートデータベースとして作成され、追加した関数などが存在すれば、データベース作成時に組み込まれます。

共通のものを使用せずにクリーンな状態でデータベースを作成したいときにはtemplate0を指定してデータベースを作成します。

本サイトでは、「quiz」データベースを作成します。

#「quiz」のデータベースを作成
!sudo -u postgres psql -U postgres -c 'CREATE DATABASE quiz;'

テーブル

本サイトで利用する各テーブルを作成します。

#テーブルを作成
!sudo -u postgres psql -U postgres -d quiz -c 'CREATE TABLE public.quiz_view_type(id smallserial PRIMARY KEY,quiz_view_type_name character varying(512) COLLATE pg_catalog."default" NOT NULL)'
!sudo -u postgres psql -U postgres -d quiz -c 'CREATE TABLE public.ipa_type(id smallserial PRIMARY KEY,ipa_type_name character varying(512) COLLATE pg_catalog."default" NOT NULL)'
!sudo -u postgres psql -U postgres -d quiz -c 'CREATE TABLE public.user(id bigserial PRIMARY KEY,nicname character varying(50) COLLATE pg_catalog."default" NOT NULL,password character varying(4096) COLLATE pg_catalog."default" NOT NULL,sex smallint NOT NULL,age smallint NOT NULL,create_time timestamp NOT NULL)'
!sudo -u postgres psql -U postgres -d quiz -c 'CREATE TABLE public.quiz_class(id smallserial PRIMARY KEY NOT NULL,quiz_class_name character varying(512) COLLATE pg_catalog."default" NOT NULL)'
!sudo -u postgres psql -U postgres -d quiz -c 'CREATE TABLE public.quiz_type(id smallserial PRIMARY KEY,quiz_type_name character varying(512) COLLATE pg_catalog."default" NOT NULL,quiz_class_id smallint NOT NULL references quiz_class(id))'
!sudo -u postgres psql -U postgres -d quiz -c 'CREATE TABLE public.quiz_ipa(parent_id smallint NOT NULL,ipa_type smallint NOT NULL references ipa_type(id),quiz_type smallint NOT NULL references quiz_type(id),ipa_year smallint NOT NULL,ipa_no smallint NOT NULL,PRIMARY KEY (quiz_type,ipa_year,ipa_no))'
!sudo -u postgres psql -U postgres -d quiz -c 'CREATE TABLE public.answer(answer_group_id bigint NOT NULL,answer character varying(4096) COLLATE pg_catalog."default" NOT NULL,consecutive_numbers smallint NOT NULL,PRIMARY KEY ( answer_group_id,consecutive_numbers))'
!sudo -u postgres psql -U postgres -d quiz -c 'CREATE TABLE public.quiz(id bigserial PRIMARY KEY NOT NULL,quiz character varying(4096) COLLATE pg_catalog."default" NOT NULL,quiz_image_url character varying(512) COLLATE pg_catalog."default",quiz_type smallint NOT NULL references quiz_type(id),quiz_view_type smallint NOT NULL references quiz_view_type(id),answer_group_id bigint NOT NULL,right_consecutive_numbers smallint NOT NULL,answer_explanation character varying(8192) COLLATE pg_catalog."default",reference_url character varying(512) COLLATE pg_catalog."default",FOREIGN KEY (answer_group_id, right_consecutive_numbers) REFERENCES answer (answer_group_id, consecutive_numbers))'
!sudo -u postgres psql -U postgres -d quiz -c 'CREATE TABLE public.quiz_history(id bigserial PRIMARY KEY,user_id bigint NOT NULL REFERENCES public.user(id),quiz_id bigint NOT NULL REFERENCES quiz(id),answer_group_id bigint NOT NULL,answer_id smallint NOT NULL,quiz_view_time bigint NOT NULL,quiz_answer_time bigint NOT NULL,quiz_right boolean NOT NULL,FOREIGN KEY (answer_group_id, answer_id) REFERENCES answer (answer_group_id, consecutive_numbers))'
!sudo -u postgres psql -U postgres -d quiz -c 'CREATE TABLE public.user_history(id bigserial PRIMARY KEY,user_id bigint references public.user(id),nicname character varying(50) COLLATE pg_catalog."default" NOT NULL,password character varying(4096) COLLATE pg_catalog."default" NOT NULL,sex smallint NOT NULL,age smallint NOT NULL,update_time timestamp NOT NULL)'

インデックス

ロール

ビュー

ビューは正規化されたテーブルを結合または必要な情報の導出を行い導出表としてユーザが簡単に問合せが行え、パスワード・個人情報などのユーザに不要なデータを隠蔽してセキュリティを確保するために使用されます。

一つの表に対して更新可能なビューが定義されている場合、元となる表に対してそのビューの所有者がもっているすべての権限が自動的に付与されます。

通常、ビューでは問合せのみですが、マテリアライズドビューとして作成することで更新可能なビューになりテーブルと同じようにINSERT、UPDATE、DELETEが行えるようになります。
ただ、更新可能なのはビュー作成時に、GROUP化されていない・関数・HAVING、LIMIT、OFFSETを使用していない必要があります。

ルール

指定したテーブルに対して指定したイベント(SELECT・INSERT・UPDATE・DROP等)が実行されたときに追加のコマンドを実行します。

トリガー

ルールと似ていますが、指定したテーブルに対して指定したイベントが発生したときに指定した関数を実行します。 値のチェックが必要な場合などは、こちらのトリガーを指定します。

シーケンス

決められたルールで採番を行う番号を生成します。
nextval()関数で次の新しい番号に更新され取得できます。

関数定義

一連の処理をまとめて行う関数を定義します。

関数は、「SELECT * FROM 関数名(引数名,引数名....)」で呼び出すことができます。

関数は、LANGUAGEを「SQL」「PL/pgSQL」「内部関数」「C言語関数」の4つがあります。

プロシージャ定義

プロシージャを定義します。

関数とほぼ同じですが、呼び出し方が違います。 「CALL プロシジャー名(引数,引数....)」