PgAdminでQuery Toolを使ったSQL実行時の注意点

はじめに

PgAdminQuery 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
);
カラム名データ型制約説明
idBIGINTPRIMARY KEY, GENERATED ALWAYS AS IDENTITY自動採番のID
titleTEXTNOT NULLTODOのタイトル
descriptionTEXT-TODOの詳細説明
due_dateDATE-期限日
is_completedBOOLEANDEFAULT 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);
query-tool-01

実行前のテーブル状態

idtitledescriptiondue_dateis_completed
(データなし)

実行後のテーブル状態

idtitledescriptiondue_dateis_completed
1title1説明12025-10-23false
2title2説明22025-11-23false
3title3説明32025-12-23false
4title4説明42026-01-23false
query-tool-02

行を選択して実行 (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);
query-tool-03

※当然エラーとなる query-tool-04

実行前のテーブル状態

idtitledescriptiondue_dateis_completed
(データなし)

実行後のテーブル状態

idtitledescriptiondue_dateis_completed
(データなし)
query-tool-05

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);
query-tool-06

実行前のテーブル状態

idtitledescriptiondue_dateis_completed
(データなし)

実行後のテーブル状態

idtitledescriptiondue_dateis_completed
18title1説明12025-10-23false
19title2説明22025-11-23false
20title3説明32025-12-23false
21title4説明42026-01-23false
query-tool-07

行を選択しないで実行 (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);
query-tool-08

エラーとなる。 query-tool-09

実行前のテーブル状態

idtitledescriptiondue_dateis_completed
(データなし)

実行後のテーブル状態

idtitledescriptiondue_dateis_completed
(データなし)
query-tool-10

エラー行以外を選択して実行

以下の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);
query-tool-11

実行前のテーブル状態

idtitledescriptiondue_dateis_completed
(データなし)

実行後のテーブル状態

idtitledescriptiondue_dateis_completed
24title1説明12025-10-23false
25title2説明22025-11-23false
26title4説明42026-01-23false
query-tool-12

※選択した行のみ実行されている。

Execute Scriptの挙動について

  • 選択している箇所がある→選択行のみスクリプトとしてSQLを実行
  • 選択している箇所がない→Queryパネル内に記載のSQLをすべて実行

上記の結果であることがわかる。

Execute Queryについて

個人的に、Execute Queryはほとんど使わないのだが、こっちも見てみた。

こちらは、選択している(カーソルがある)行のSQLを実行対象としている。
例えば、2行目を選択している(カーソルがある)場合は、2行目のSQLだけが実行される形となる。

参考

おわりに

業務でPgAdminをよく使うので挙動について確認しておいた。
特にミスできない状況でツールの使い方で失敗したということは起こしたくないため…。
※トランザクションを使ったSQLのパッチ適用とかは要注意しておきたい。

よく使う他のツールであるA5M2だと挙動も違うので、これは改めて調べておきたい。
あっちはあっちで、プロシージャの実行は専用の実行ボタンがあったりするので。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。