はじめに
PgAdminのQuery Toolを使用してSQLを実行した際の挙動について確認していく。
環境
PgAdmin4 9.6
PostgreSQL 17.5 (Debian 17.5-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit準備
- PgAdminをインストールする
- 接続可能なPostgreSQLのDBを用意する
前提
todosテーブル構造
検証に使用するtodosテーブルの構造は以下の通り
create table todos (
id bigint primary key generated always as identity,
title text not null,
description text,
due_date date,
is_completed boolean default false
);| カラム名 | データ型 | 制約 | 説明 |
|---|---|---|---|
| id | BIGINT | PRIMARY KEY, GENERATED ALWAYS AS IDENTITY | 自動採番のID |
| title | TEXT | NOT NULL | TODOのタイトル |
| description | TEXT | - | TODOの詳細説明 |
| due_date | DATE | - | 期限日 |
| is_completed | BOOLEAN | DEFAULT false | 完了フラグ |
PgAdminのQuery Toolでの実行 (Execute Script)
PgAdminでは 対象のデータベースを右クリックし、Query Tool を選択することで、SQLを実行できるパネルが開く。
この時に、行を選択しているかしていないかで実行SQLが変わっているようなので調査してみる。
※以下の章では、すべてExecute Scriptで実行している。
行を選択して実行 (すべて正常終了)
まずは、以下の4行のSQLを実行してみる。
INSERT INTO todos (title, description, due_date, is_completed) VALUES ('title1', '説明1', '2025-10-23', false);
INSERT INTO todos (title, description, due_date, is_completed) VALUES ('title2', '説明2', '2025-11-23', false);
INSERT INTO todos (title, description, due_date, is_completed) VALUES ('title3', '説明3', '2025-12-23', false);
INSERT INTO todos (title, description, due_date, is_completed) VALUES ('title4', '説明4', '2026-01-23', false);
実行前のテーブル状態
| id | title | description | due_date | is_completed |
|---|---|---|---|---|
| (データなし) |
実行後のテーブル状態
| id | title | description | due_date | is_completed |
|---|---|---|---|---|
| 1 | title1 | 説明1 | 2025-10-23 | false |
| 2 | title2 | 説明2 | 2025-11-23 | false |
| 3 | title3 | 説明3 | 2025-12-23 | false |
| 4 | title4 | 説明4 | 2026-01-23 | false |

行を選択して実行 (3行目で失敗)
※あらかじめテーブルはトランケートしておく。
以下の4行のSQLを実行してみる。
INSERT INTO todos (title, description, due_date, is_completed) VALUES ('title1', '説明1', '2025-10-23', false);
INSERT INTO todos (title, description, due_date, is_completed) VALUES ('title2', '説明2', '2025-11-23', false);
INSERT INTO todos (title, description, due_date, is_completed) VALUES ('title3', '説明3', '2025-12-23', false, '1');
INSERT INTO todos (title, description, due_date, is_completed) VALUES ('title4', '説明4', '2026-01-23', false);
↓
実行前のテーブル状態
| id | title | description | due_date | is_completed |
|---|---|---|---|---|
| (データなし) |
実行後のテーブル状態
| id | title | description | due_date | is_completed |
|---|---|---|---|---|
| (データなし) |

1行目、2行目はエラーとなっていないがデータとしては挿入されていない。
行を選択しないで実行 (すべて正常終了)
同様に以下の4行のSQLを実行する。
INSERT INTO todos (title, description, due_date, is_completed) VALUES ('title1', '説明1', '2025-10-23', false);
INSERT INTO todos (title, description, due_date, is_completed) VALUES ('title2', '説明2', '2025-11-23', false);
INSERT INTO todos (title, description, due_date, is_completed) VALUES ('title3', '説明3', '2025-12-23', false);
INSERT INTO todos (title, description, due_date, is_completed) VALUES ('title4', '説明4', '2026-01-23', false);
実行前のテーブル状態
| id | title | description | due_date | is_completed |
|---|---|---|---|---|
| (データなし) |
実行後のテーブル状態
| id | title | description | due_date | is_completed |
|---|---|---|---|---|
| 18 | title1 | 説明1 | 2025-10-23 | false |
| 19 | title2 | 説明2 | 2025-11-23 | false |
| 20 | title3 | 説明3 | 2025-12-23 | false |
| 21 | title4 | 説明4 | 2026-01-23 | false |

行を選択しないで実行 (3行目で失敗)
以下の4行のSQLを実行する。
INSERT INTO todos (title, description, due_date, is_completed) VALUES ('title1', '説明1', '2025-10-23', false);
INSERT INTO todos (title, description, due_date, is_completed) VALUES ('title2', '説明2', '2025-11-23', false);
INSERT INTO todos (title, description, due_date, is_completed) VALUES ('title3', '説明3', '2025-12-23', false, '1');
INSERT INTO todos (title, description, due_date, is_completed) VALUES ('title4', '説明4', '2026-01-23', false);
↓
実行前のテーブル状態
| id | title | description | due_date | is_completed |
|---|---|---|---|---|
| (データなし) |
実行後のテーブル状態
| id | title | description | due_date | is_completed |
|---|---|---|---|---|
| (データなし) |

エラー行以外を選択して実行
以下の4行のSQLを実行する。
1,2,4行のみを選択して、Execute Scriptを実行する。
INSERT INTO todos (title, description, due_date, is_completed) VALUES ('title1', '説明1', '2025-10-23', false);
INSERT INTO todos (title, description, due_date, is_completed) VALUES ('title2', '説明2', '2025-11-23', false);
INSERT INTO todos (title, description, due_date, is_completed) VALUES ('title3', '説明3', '2025-12-23', false, '1');
INSERT INTO todos (title, description, due_date, is_completed) VALUES ('title4', '説明4', '2026-01-23', false);
実行前のテーブル状態
| id | title | description | due_date | is_completed |
|---|---|---|---|---|
| (データなし) |
実行後のテーブル状態
| id | title | description | due_date | is_completed |
|---|---|---|---|---|
| 24 | title1 | 説明1 | 2025-10-23 | false |
| 25 | title2 | 説明2 | 2025-11-23 | false |
| 26 | title4 | 説明4 | 2026-01-23 | false |

※選択した行のみ実行されている。
Execute Scriptの挙動について
- 選択している箇所がある→選択行のみスクリプトとしてSQLを実行
- 選択している箇所がない→Queryパネル内に記載のSQLをすべて実行
上記の結果であることがわかる。
Execute Queryについて
個人的に、Execute Queryはほとんど使わないのだが、こっちも見てみた。
こちらは、選択している(カーソルがある)行のSQLを実行対象としている。
例えば、2行目を選択している(カーソルがある)場合は、2行目のSQLだけが実行される形となる。
参考
- PgAdmin4 Documentation
https://www.pgadmin.org/docs/
おわりに
業務でPgAdminをよく使うので挙動について確認しておいた。
特にミスできない状況でツールの使い方で失敗したということは起こしたくないため…。
※トランザクションを使ったSQLのパッチ適用とかは要注意しておきたい。
よく使う他のツールであるA5M2だと挙動も違うので、これは改めて調べておきたい。
あっちはあっちで、プロシージャの実行は専用の実行ボタンがあったりするので。

