<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://gohugo.io/" version="0.136.2">Hugo</generator><title type="html">PostgreSQL on Interfamilia Engineer Blog</title><link href="https://blog.interfamilia.co.jp/tags/PostgreSQL/" rel="alternate" type="text/html" title="html"/><link href="https://blog.interfamilia.co.jp/tags/PostgreSQL/atom.xml" rel="self" type="application/atom+xml" title="atom"/><updated>2026-09-08T02:52:51+00:00</updated><id>https://blog.interfamilia.co.jp/tags/PostgreSQL/</id><entry><title type="html">PostgreSQL で住所マスタを作る 〜郵便住所.jp の CSV を使って〜</title><link href="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/?utm_source=atom_feed" rel="alternate" type="text/html" hreflang="en"/><id>https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/</id><author><name>Kuma</name></author><published>2026-09-08T10:00:00+09:00</published><updated>2026-09-08T10:00:00+09:00</updated><content type="html"><![CDATA[<p>こんにちは。株式会社 Interfamilia の <strong>Kuma</strong> です。</p>
<p>会員情報に住所を持たせたい、入力フォームで郵便番号から住所を自動補完したい、都道府県のプルダウンを作りたい……。<br>
システムを開発していると、<strong>郵便番号や住所のマスタ</strong>が必要になる場面はしょっちゅうあります。</p>
<p>当社では、そんなときに使えるサービスとして <strong><a class="gblog-post__link" href="https://postaladdress.jp/">郵便住所.jp</a>
</strong> を公開しています。<br>
日本郵便さんが公開している郵便番号データを整理して、<strong>欲しい項目だけを選んで CSV でダウンロードできる</strong>サービスです。</p>
<blockquote>
<p><strong><a class="gblog-post__link" href="https://postaladdress.jp/">郵便住所.jp</a>
</strong><br>
郵便番号検索、住所検索、住所マスタ用 CSV ダウンロードサービス</p>
</blockquote>
<p>今回の記事では、この <strong><a class="gblog-post__link" href="https://postaladdress.jp/">郵便住所.jp</a>
</strong> からダウンロードした CSV を使って、<strong>PostgreSQL に住所マスタのデータベースを作るところまで</strong>を、ひととおりやってみたいと思います。<br>
<code>docker compose up</code> を実行したらデータベースもテーブルもデータも全部できあがっている、という状態をゴールにします。</p>
<p>※初学者向けの記事になっています。</p>
<hr>
<p><strong>目次</strong></p>



  <div class="gblog-toc gblog-toc__level--3"><nav id="TableOfContents">
  <ul>
    <li>
      <ul>
        <li><a href="#郵便住所jp-について">郵便住所.jp について</a></li>
        <li><a href="#作成するデータベースの構成">作成するデータベースの構成</a>
          <ul>
            <li><a href="#テーブルの項目">テーブルの項目</a></li>
          </ul>
        </li>
        <li><a href="#利用する前に">利用する前に</a></li>
        <li><a href="#1-ファイルを配置するディレクトリを作る">1. ファイルを配置するディレクトリを作る</a></li>
        <li><a href="#2-csv-をダウンロードする">2. CSV をダウンロードする</a>
          <ul>
            <li><a href="#2-1-都道府県">2-1. 都道府県</a></li>
            <li><a href="#2-2-市区町村">2-2. 市区町村</a></li>
            <li><a href="#2-3-郵便住所">2-3. 郵便住所</a></li>
            <li><a href="#2-4-解凍してリネームする">2-4. 解凍してリネームする</a></li>
          </ul>
        </li>
        <li><a href="#3-postaladdress-データベースを作る">3. postaladdress データベースを作る</a></li>
        <li><a href="#4-テーブルを作成する">4. テーブルを作成する</a>
          <ul>
            <li><a href="#4-1-都道府県テーブル">4-1. 都道府県テーブル</a></li>
            <li><a href="#4-2-市区町村テーブルfk-あり">4-2. 市区町村テーブル（FK あり）</a></li>
            <li><a href="#4-3-郵便住所テーブルfk-あり">4-3. 郵便住所テーブル（FK あり）</a></li>
            <li><a href="#4-4-インデックスを作る">4-4. インデックスを作る</a></li>
          </ul>
        </li>
        <li><a href="#5-csv-をインポートする">5. CSV をインポートする</a>
          <ul>
            <li><a href="#copy-の書き方の注意"><code>\copy</code> の書き方の注意</a></li>
            <li><a href="#ヘッダー行が無いので-header-は付けない">ヘッダー行が無いので <code>HEADER</code> は付けない</a></li>
            <li><a href="#id-があるテーブルは項目名を明示する"><code>id</code> があるテーブルは項目名を明示する</a></li>
            <li><a href="#force_null-で空文字を-null-にする"><code>FORCE_NULL</code> で空文字を NULL にする</a></li>
            <li><a href="#取り込む順番に注意">取り込む順番に注意</a></li>
          </ul>
        </li>
        <li><a href="#6-起動して確認する">6. 起動して確認する</a></li>
        <li><a href="#7-select-文の例">7. SELECT 文の例</a>
          <ul>
            <li><a href="#都道府県の一覧を取得する">都道府県の一覧を取得する</a></li>
            <li><a href="#指定した都道府県の市区町村の一覧を取得する">指定した都道府県の市区町村の一覧を取得する</a></li>
            <li><a href="#郵便番号から住所を取得する">郵便番号から住所を取得する</a></li>
            <li><a href="#住所から郵便番号を検索する">住所から郵便番号を検索する</a></li>
            <li><a href="#都道府県ごとの郵便番号の件数を数える">都道府県ごとの郵便番号の件数を数える</a></li>
            <li><a href="#1つの郵便番号に複数の町域があるものを探す">1つの郵便番号に複数の町域があるものを探す</a></li>
            <li><a href="#ローマ字が設定されていない住所を探す">ローマ字が設定されていない住所を探す</a></li>
          </ul>
        </li>
        <li><a href="#8-うまくいかないときは">8. うまくいかないときは</a>
          <ul>
            <li><a href="#やり直したい">やり直したい</a></li>
            <li><a href="#error-missing-data-for-column-"><code>ERROR: missing data for column &quot;...&quot;</code></a></li>
            <li><a href="#error-value-too-long-for-type-character5"><code>ERROR: value too long for type character(5)</code></a></li>
            <li><a href="#error-insert-or-update-on-table--violates-foreign-key-constraint"><code>ERROR: insert or update on table ... violates foreign key constraint</code></a></li>
            <li><a href="#error-extra-data-after-last-expected-column"><code>ERROR: extra data after last expected column</code></a></li>
            <li><a href="#error-could-not-open-file-csvprefecturecsv-for-reading"><code>ERROR: could not open file &quot;/csv/prefecture.csv&quot; for reading</code></a></li>
            <li><a href="#日本語が文字化けする">日本語が文字化けする</a></li>
          </ul>
        </li>
        <li><a href="#最後に">最後に</a></li>
        <li><a href="#参考リンク">参考リンク</a></li>
        <li><a href="#会社を一緒に盛り上げてくれる仲間を募集しています">会社を一緒に盛り上げてくれる仲間を募集しています！</a></li>
      </ul>
    </li>
  </ul>
</nav><hr></div>


<hr>



<div class="gblog-post__anchorwrap">
    <h2 id="郵便住所jp-について">
        郵便住所.jp について
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#郵便住所jp-について" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 郵便住所.jp について" href="#%e9%83%b5%e4%be%bf%e4%bd%8f%e6%89%80jp-%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h2>
</div>

<p>まずは、これから使うサービスについて簡単に紹介させてください。</p>
<p><strong><a class="gblog-post__link" href="https://postaladdress.jp/">郵便住所.jp</a>
</strong> は、日本郵便さんが公開している <strong><a class="gblog-post__link" href="https://www.post.japanpost.jp/service/search/zipcode/download/">郵便番号データ</a>
</strong> を整理して公開しているサイトです。<br>
Web 上で郵便番号検索・住所検索ができるほか、<strong>データを RDB に展開しやすいかたち</strong>で CSV としてダウンロードできるようになっています。</p>
<p>特徴はこのあたりです。</p>
<ul>
<li><strong>欲しい項目だけを選べる</strong><br>
チェックボックスで項目を選ぶと、その並びどおりの CSV が生成されます。テーブルのカラム構成に合わせて CSV を作れるので、取り込みが非常に楽になります。</li>
<li><strong>登録不要・無料</strong><br>
会員登録も API キーも不要です。フォームでポチポチ選んでボタンを押すだけです。</li>
<li><strong>都道府県・市区町村・郵便住所の3つに分かれている</strong><br>
それぞれに<strong>コード</strong>が振られているので、そのままリレーションを張れます。</li>
<li><strong>月に1回くらいのペースで更新</strong><br>
日本郵便さんの更新に追従しています。ローマ字だけは元データの更新が年1回程度なので、そのペースになります。</li>
</ul>
<p>なお、ダウンロードした CSV の再配布は<a class="gblog-post__link" href="https://postaladdress.jp/terms">利用規約</a>
で禁止しています。<br>
この記事でも CSV そのものは配布せず、<strong>ご自身でダウンロードしていただく</strong>手順で進めます。最新のデータが手に入るので、そのほうが都合も良いはずです。</p>
<hr>



<div class="gblog-post__anchorwrap">
    <h2 id="作成するデータベースの構成">
        作成するデータベースの構成
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#作成するデータベースの構成" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 作成するデータベースの構成" href="#%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9%e3%81%ae%e6%a7%8b%e6%88%90">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h2>
</div>

<p>今回作るのは、こんな構成のデータベースです。</p>



<script defer src="/js/mermaid.min.js"></script>



<pre class="gblog-mermaid mermaid">
erDiagram
    prefecture ||--o{ municipality : "prefecture_code"
    municipality ||--o{ postal_address : "municipality_code"
</pre>

<ul>
<li>データベース
<ul>
<li><code>postaladdress</code> (郵便住所)</li>
</ul>
</li>
<li>テーブル
<ul>
<li><code>prefecture</code> (都道府県)</li>
<li><code>municipality</code> (市区町村) … <code>prefecture</code> への FK を持つ</li>
<li><code>postal_address</code> (郵便住所) … <code>municipality</code> への FK を持つ</li>
</ul>
</li>
</ul>
<p><code>prefecture</code> → <code>municipality</code> → <code>postal_address</code> と、上から下に親子関係になっています。<br>
都道府県は 47 件、市区町村は 1,892 件、郵便住所は 122,653 件です（2026年8月31日版のデータの場合）。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="テーブルの項目">
        テーブルの項目
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#テーブルの項目" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor テーブルの項目" href="#%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e3%81%ae%e9%a0%85%e7%9b%ae">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p><strong><code>prefecture</code> (都道府県)</strong></p>
<table>
  <thead>
      <tr>
          <th>カラム</th>
          <th>型</th>
          <th>内容</th>
          <th>例</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>prefecture_code</code></td>
          <td><code>char(2)</code></td>
          <td>都道府県コード (PK)</td>
          <td><code>13</code></td>
      </tr>
      <tr>
          <td><code>prefecture_name</code></td>
          <td><code>text</code></td>
          <td>都道府県名</td>
          <td><code>東京都</code></td>
      </tr>
      <tr>
          <td><code>prefecture_name_kana</code></td>
          <td><code>text</code></td>
          <td>都道府県名カナ</td>
          <td><code>トウキョウト</code></td>
      </tr>
      <tr>
          <td><code>prefecture_name_rome</code></td>
          <td><code>text</code></td>
          <td>都道府県名ローマ字</td>
          <td><code>TOKYO TO</code></td>
      </tr>
  </tbody>
</table>
<p><strong><code>municipality</code> (市区町村)</strong></p>
<table>
  <thead>
      <tr>
          <th>カラム</th>
          <th>型</th>
          <th>内容</th>
          <th>例</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>municipality_code</code></td>
          <td><code>char(5)</code></td>
          <td>市区町村コード (PK)</td>
          <td><code>13101</code></td>
      </tr>
      <tr>
          <td><code>municipality_name</code></td>
          <td><code>text</code></td>
          <td>市区町村名</td>
          <td><code>千代田区</code></td>
      </tr>
      <tr>
          <td><code>municipality_name_kana</code></td>
          <td><code>text</code></td>
          <td>市区町村名カナ</td>
          <td><code>チヨダク</code></td>
      </tr>
      <tr>
          <td><code>municipality_name_rome</code></td>
          <td><code>text</code></td>
          <td>市区町村名ローマ字</td>
          <td><code>CHIYODA KU</code></td>
      </tr>
      <tr>
          <td><code>prefecture_code</code></td>
          <td><code>char(2)</code></td>
          <td>都道府県コード (FK)</td>
          <td><code>13</code></td>
      </tr>
  </tbody>
</table>
<p><strong><code>postal_address</code> (郵便住所)</strong></p>
<table>
  <thead>
      <tr>
          <th>カラム</th>
          <th>型</th>
          <th>内容</th>
          <th>例</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>id</code></td>
          <td><code>bigint</code></td>
          <td>ID (PK)</td>
          <td><code>1</code></td>
      </tr>
      <tr>
          <td><code>postal_code</code></td>
          <td><code>char(7)</code></td>
          <td>郵便番号</td>
          <td><code>1000001</code></td>
      </tr>
      <tr>
          <td><code>municipality_code</code></td>
          <td><code>char(5)</code></td>
          <td>市区町村コード (FK)</td>
          <td><code>13101</code></td>
      </tr>
      <tr>
          <td><code>street_name</code></td>
          <td><code>text</code></td>
          <td>町域名</td>
          <td><code>千代田</code></td>
      </tr>
      <tr>
          <td><code>street_name_kana</code></td>
          <td><code>text</code></td>
          <td>町域名カナ</td>
          <td><code>チヨダ</code></td>
      </tr>
      <tr>
          <td><code>street_name_rome</code></td>
          <td><code>text</code></td>
          <td>町域名ローマ字</td>
          <td><code>CHIYODA</code></td>
      </tr>
  </tbody>
</table>
<p><code>postal_address</code> にだけ <code>id</code> という項目があります。これは CSV には無い、こちらで採番する項目です。<br>
理由は後ほど説明します。</p>
<hr>



<div class="gblog-post__anchorwrap">
    <h2 id="利用する前に">
        利用する前に
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#利用する前に" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 利用する前に" href="#%e5%88%a9%e7%94%a8%e3%81%99%e3%82%8b%e5%89%8d%e3%81%ab">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h2>
</div>

<p>事前に以下の準備をお願いします。</p>
<ul>
<li>Docker Desktop がインストールされており <code>docker compose</code> コマンドが使える。</li>
</ul>
<p>PostgreSQL のインストールは不要です。Docker のコンテナ上に作ります。</p>
<p>なお、今回作成する一式は当社の GitHub リポジトリでも公開しています。<br>
手っ取り早く試したい方はこちらをご利用ください。</p>
<blockquote>
<p><strong><a class="gblog-post__link" href="https://github.com/interfamilia/testing-postgresql-docker">interfamilia/testing-postgresql-docker</a>
</strong><br>
PostgreSQL 検証用 Docker 環境</p>
</blockquote>
<hr>



<div class="gblog-post__anchorwrap">
    <h2 id="1-ファイルを配置するディレクトリを作る">
        1. ファイルを配置するディレクトリを作る
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#1-ファイルを配置するディレクトリを作る" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 1. ファイルを配置するディレクトリを作る" href="#1-%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e9%85%8d%e7%bd%ae%e3%81%99%e3%82%8b%e3%83%87%e3%82%a3%e3%83%ac%e3%82%af%e3%83%88%e3%83%aa%e3%82%92%e4%bd%9c%e3%82%8b">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h2>
</div>

<p>まず、作業用のディレクトリを以下の構成で作ります。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">testing-postgresql-docker/
</span></span><span class="line"><span class="cl">├── docker-compose.yml
</span></span><span class="line"><span class="cl">├── csv/            ← ダウンロードした CSV を置く
</span></span><span class="line"><span class="cl">└── initdb/         ← 起動時に実行される SQL を置く
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">C<span class="p">:</span><span class="nl">\Users\Kuma</span><span class="c1">&gt; mkdir testing-postgresql-docker</span>
</span></span><span class="line"><span class="cl">C<span class="p">:</span><span class="nl">\Users\Kuma</span><span class="c1">&gt; cd ./testing-postgresql-docker</span>
</span></span><span class="line"><span class="cl">C<span class="p">:</span><span class="nl">\Users\Kuma\testing-postgresql-docker</span><span class="c1">&gt; mkdir csv</span>
</span></span><span class="line"><span class="cl">C<span class="p">:</span><span class="nl">\Users\Kuma\testing-postgresql-docker</span><span class="c1">&gt; mkdir initdb</span>
</span></span></code></pre></div><hr>



<div class="gblog-post__anchorwrap">
    <h2 id="2-csv-をダウンロードする">
        2. CSV をダウンロードする
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#2-csv-をダウンロードする" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 2. CSV をダウンロードする" href="#2-csv-%e3%82%92%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89%e3%81%99%e3%82%8b">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h2>
</div>

<p><a class="gblog-post__link" href="https://postaladdress.jp/">郵便住所.jp</a>
 から、<strong>都道府県・市区町村・郵便住所</strong>の3つの CSV をダウンロードします。</p>
<p>ここが今回いちばん大事なところです。<br>
<strong>CSV の項目の並び順は、画面に並んでいる順で固定</strong>されています。チェックした順ではありません。<br>
なので、<strong>これから作るテーブルのカラムの並びと、チェックする項目の並びを合わせる</strong>必要があります。</p>
<p>また、いくつかの項目は<strong>最初からチェックが入っています</strong>。今回は使わない項目もあるので、<strong>チェックを外す</strong>のを忘れないでください。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="2-1-都道府県">
        2-1. 都道府県
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#2-1-都道府県" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 2-1. 都道府県" href="#2-1-%e9%83%bd%e9%81%93%e5%ba%9c%e7%9c%8c">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p><strong><a class="gblog-post__link" href="https://postaladdress.jp/prefecture/csv">都道府県の情報を CSV でダウンロードする</a>
</strong> を開いて、以下のようにチェックします。</p>
<table>
  <thead>
      <tr>
          <th>項目</th>
          <th>チェック</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>都道府県コード</td>
          <td>✅</td>
      </tr>
      <tr>
          <td>都道府県名</td>
          <td>✅</td>
      </tr>
      <tr>
          <td>都道府県名カナ</td>
          <td>✅</td>
      </tr>
      <tr>
          <td>都道府県名ローマ字</td>
          <td>✅</td>
      </tr>
  </tbody>
</table>















<div class="flex justify-center">
<figure class="gblog-post__figure">
    <a class="gblog-post__link--raw" href="/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/images/01-prefecture-csv.png">
        <img
            loading="lazy"
            
            src="/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/images/01-prefecture-csv_hu10099545199252172532.png" alt="都道府県は4項目すべてを選択する"
            />
    </a>
    
    <figcaption>都道府県は4項目すべてを選択する</figcaption>
    
</figure>
</div>


<p>4つとも全部チェックします。<br>
［都道府県を CSV でダウンロードする］ボタンをクリックすると <code>都道府県.zip</code> がダウンロードされます。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="2-2-市区町村">
        2-2. 市区町村
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#2-2-市区町村" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 2-2. 市区町村" href="#2-2-%e5%b8%82%e5%8c%ba%e7%94%ba%e6%9d%91">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p><strong><a class="gblog-post__link" href="https://postaladdress.jp/municipality/csv">市区町村の情報を CSV でダウンロードする</a>
</strong> を開いて、以下のようにチェックします。</p>
<table>
  <thead>
      <tr>
          <th>項目</th>
          <th>チェック</th>
          <th></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>市区町村コード</td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>市区町村名</td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>市区町村名カナ</td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>市区町村名ローマ字</td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>都道府県コード</td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>都道府県名</td>
          <td>❌</td>
          <td><code>prefecture</code> テーブルにあるので不要</td>
      </tr>
      <tr>
          <td>都道府県名カナ</td>
          <td>❌</td>
          <td>同上</td>
      </tr>
      <tr>
          <td>都道府県名ローマ字</td>
          <td>❌</td>
          <td>同上</td>
      </tr>
      <tr>
          <td>廃止フラグ</td>
          <td>❌</td>
          <td></td>
      </tr>
  </tbody>
</table>















<div class="flex justify-center">
<figure class="gblog-post__figure">
    <a class="gblog-post__link--raw" href="/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/images/02-municipality-csv.png">
        <img
            loading="lazy"
            
            src="/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/images/02-municipality-csv_hu14655584076998748986.png" alt="市区町村は都道府県名を含めず、市区町村の4項目と都道府県コードを選択する"
            />
    </a>
    
    <figcaption>市区町村は都道府県名を含めず、市区町村の4項目と都道府県コードを選択する</figcaption>
    
</figure>
</div>


<p>都道府県名は <code>prefecture</code> テーブルに持っているので、<code>municipality</code> 側では<strong>持ちません</strong>。<br>
同じ情報を2か所に持つと、片方だけ直して食い違う、ということが起きます。<strong>コードだけを持って、名前が必要なときは JOIN して取る</strong>のが基本の形です。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="2-3-郵便住所">
        2-3. 郵便住所
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#2-3-郵便住所" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 2-3. 郵便住所" href="#2-3-%e9%83%b5%e4%be%bf%e4%bd%8f%e6%89%80">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p><strong><a class="gblog-post__link" href="https://postaladdress.jp/address/csv">郵便番号や住所の情報を CSV でダウンロードする</a>
</strong> を開いて、以下のようにチェックします。</p>
<table>
  <thead>
      <tr>
          <th>項目</th>
          <th>チェック</th>
          <th></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>郵便番号</td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>都道府県コード</td>
          <td>❌</td>
          <td><strong>最初から ON なので外す</strong></td>
      </tr>
      <tr>
          <td>都道府県名</td>
          <td>❌</td>
          <td><strong>最初から ON なので外す</strong></td>
      </tr>
      <tr>
          <td>都道府県名カナ</td>
          <td>❌</td>
          <td></td>
      </tr>
      <tr>
          <td>都道府県名ローマ字</td>
          <td>❌</td>
          <td></td>
      </tr>
      <tr>
          <td>市区町村コード</td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>市区町村名</td>
          <td>❌</td>
          <td><strong>最初から ON なので外す</strong></td>
      </tr>
      <tr>
          <td>市区町村名カナ</td>
          <td>❌</td>
          <td></td>
      </tr>
      <tr>
          <td>市区町村名ローマ字</td>
          <td>❌</td>
          <td></td>
      </tr>
      <tr>
          <td>町域名</td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>町域名カナ</td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>町域名ローマ字</td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>廃止フラグ</td>
          <td>❌</td>
          <td></td>
      </tr>
  </tbody>
</table>















<div class="flex justify-center">
<figure class="gblog-post__figure">
    <a class="gblog-post__link--raw" href="/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/images/03-address-csv.png">
        <img
            loading="lazy"
            
            src="/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/images/03-address-csv_hu18188997194921549992.png" alt="郵便番号・住所は初期選択されている都道府県コード・都道府県名・市区町村名を外す"
            />
    </a>
    
    <figcaption>郵便番号・住所は初期選択されている都道府県コード・都道府県名・市区町村名を外す</figcaption>
    
</figure>
</div>


<p>下のほうにある「廃止データを含める」「以下に掲載がない場合を含める」「町域を集約する」の3つのオプションは、<strong>すべてチェックしません</strong>。</p>
<p>都道府県コードも、<code>municipality</code> を経由してたどれるので持ちません。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="2-4-解凍してリネームする">
        2-4. 解凍してリネームする
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#2-4-解凍してリネームする" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 2-4. 解凍してリネームする" href="#2-4-%e8%a7%a3%e5%87%8d%e3%81%97%e3%81%a6%e3%83%aa%e3%83%8d%e3%83%bc%e3%83%a0%e3%81%99%e3%82%8b">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p>ダウンロードした3つの ZIP を解凍します。<br>
中に入っている CSV は <code>2026-08-07.145642.0012399962363261963683.csv</code> のような<strong>毎回変わるファイル名</strong>になっているので、以下の名前にリネームして <code>csv</code> ディレクトリに置いてください。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">testing-postgresql-docker/
</span></span><span class="line"><span class="cl">└── csv/
</span></span><span class="line"><span class="cl">    ├── prefecture.csv
</span></span><span class="line"><span class="cl">    ├── municipality.csv
</span></span><span class="line"><span class="cl">    └── postal_address.csv
</span></span></code></pre></div><p>中身はこんな感じの CSV になっています。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">prefecture.csv
</span></span><span class="line"><span class="cl"><span class="s2">&#34;01&#34;</span>,<span class="s2">&#34;北海道&#34;</span>,<span class="s2">&#34;ホッカイドウ&#34;</span>,<span class="s2">&#34;HOKKAIDO&#34;</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;02&#34;</span>,<span class="s2">&#34;青森県&#34;</span>,<span class="s2">&#34;アオモリケン&#34;</span>,<span class="s2">&#34;AOMORI KEN&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">municipality.csv
</span></span><span class="line"><span class="cl"><span class="s2">&#34;01101&#34;</span>,<span class="s2">&#34;札幌市中央区&#34;</span>,<span class="s2">&#34;サッポロシチュウオウク&#34;</span>,<span class="s2">&#34;SAPPORO SHI CHUO KU&#34;</span>,<span class="s2">&#34;01&#34;</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;01102&#34;</span>,<span class="s2">&#34;札幌市北区&#34;</span>,<span class="s2">&#34;サッポロシキタク&#34;</span>,<span class="s2">&#34;SAPPORO SHI KITA KU&#34;</span>,<span class="s2">&#34;01&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">postal_address.csv
</span></span><span class="line"><span class="cl"><span class="s2">&#34;0010010&#34;</span>,<span class="s2">&#34;01102&#34;</span>,<span class="s2">&#34;北十条西（１～４丁目）&#34;</span>,<span class="s2">&#34;キタ１０ジョウニシ（１－４チョウメ）&#34;</span>,<span class="s2">&#34;KITA10-JONISHI(1-4-CHOME)&#34;</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;0010011&#34;</span>,<span class="s2">&#34;01102&#34;</span>,<span class="s2">&#34;北十一条西（１～４丁目）&#34;</span>,<span class="s2">&#34;キタ１１ジョウニシ（１－４チョウメ）&#34;</span>,<span class="s2">&#34;KITA11-JONISHI(1-4-CHOME)&#34;</span>
</span></span></code></pre></div><p>郵便住所.jp の CSV の仕様は以下のとおりです。あとで取り込むときに効いてきます。</p>
<ul>
<li>文字コード：<strong>UTF-8</strong>（BOM なし）</li>
<li>改行コード：<strong>LF</strong></li>
<li><strong>ヘッダー行なし</strong></li>
<li>すべての項目が<strong>ダブルクォートで囲まれている</strong></li>
<li>値が無い項目は <code>&quot;&quot;</code>（空文字）</li>
</ul>
<hr>



<div class="gblog-post__anchorwrap">
    <h2 id="3-postaladdress-データベースを作る">
        3. postaladdress データベースを作る
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#3-postaladdress-データベースを作る" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 3. postaladdress データベースを作る" href="#3-postaladdress-%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9%e3%82%92%e4%bd%9c%e3%82%8b">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h2>
</div>

<p><code>docker-compose.yml</code> を作成します。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">postgres</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">postgres:17</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">container_name</span><span class="p">:</span><span class="w"> </span><span class="l">testing-postgresql</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">POSTGRES_USER</span><span class="p">:</span><span class="w"> </span><span class="l">postgres</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">POSTGRES_PASSWORD</span><span class="p">:</span><span class="w"> </span><span class="l">postgres</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">POSTGRES_DB</span><span class="p">:</span><span class="w"> </span><span class="l">postaladdress</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">TZ</span><span class="p">:</span><span class="w"> </span><span class="l">Asia/Tokyo</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;5432:5432&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">postgres-data:/var/lib/postgresql/data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">./initdb:/docker-entrypoint-initdb.d</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">./csv:/csv</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">postgres-data</span><span class="p">:</span><span class="w">
</span></span></span></code></pre></div><p>ポイントは3つです。</p>
<p><strong><code>POSTGRES_DB: postaladdress</code></strong><br>
これが <strong><code>postaladdress</code> データベースの作成</strong>にあたります。コンテナが最初に起動するときに、この名前のデータベースを作ってくれます。</p>
<p>Docker を使わず、すでにある PostgreSQL に作る場合は、以下の SQL が同じことをします。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">CREATE</span><span class="w"> </span><span class="k">DATABASE</span><span class="w"> </span><span class="n">postaladdress</span><span class="w"> </span><span class="k">ENCODING</span><span class="w"> </span><span class="s1">&#39;UTF8&#39;</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p><strong><code>./initdb:/docker-entrypoint-initdb.d</code></strong><br>
PostgreSQL の公式イメージは、<strong>初回起動時に <code>/docker-entrypoint-initdb.d</code> の中の <code>.sql</code> ファイルを名前順に実行</strong>してくれます。<br>
ここにテーブル作成とデータ取り込みの SQL を置いておけば、<code>docker compose up</code> するだけで全部できあがる、というわけです。</p>
<p><strong><code>./csv:/csv</code></strong><br>
CSV をコンテナの中から見えるようにしています。コンテナの中では <code>/csv/prefecture.csv</code> というパスになります。</p>
<hr>



<div class="gblog-post__anchorwrap">
    <h2 id="4-テーブルを作成する">
        4. テーブルを作成する
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#4-テーブルを作成する" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 4. テーブルを作成する" href="#4-%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h2>
</div>

<p><code>initdb/01_create_table.sql</code> を作成します。<br>
ファイル名の先頭に <code>01_</code> と付けているのは、<strong><code>02_</code> より先に実行させたい</strong>からです。テーブルが無いとデータは入れられません。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="4-1-都道府県テーブル">
        4-1. 都道府県テーブル
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#4-1-都道府県テーブル" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 4-1. 都道府県テーブル" href="#4-1-%e9%83%bd%e9%81%93%e5%ba%9c%e7%9c%8c%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">prefecture</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">prefecture_code</span><span class="w">      </span><span class="nb">char</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">prefecture_name</span><span class="w">      </span><span class="nb">text</span><span class="w">    </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">prefecture_name_kana</span><span class="w"> </span><span class="nb">text</span><span class="w">    </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">prefecture_name_rome</span><span class="w"> </span><span class="nb">text</span><span class="w">    </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">CONSTRAINT</span><span class="w"> </span><span class="n">pk_prefecture</span><span class="w"> </span><span class="k">PRIMARY</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="p">(</span><span class="n">prefecture_code</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">COMMENT</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">TABLE</span><span class="w">  </span><span class="n">prefecture</span><span class="w">                      </span><span class="k">IS</span><span class="w"> </span><span class="s1">&#39;都道府県&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">COMMENT</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">COLUMN</span><span class="w"> </span><span class="n">prefecture</span><span class="p">.</span><span class="n">prefecture_code</span><span class="w">      </span><span class="k">IS</span><span class="w"> </span><span class="s1">&#39;都道府県コード&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">COMMENT</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">COLUMN</span><span class="w"> </span><span class="n">prefecture</span><span class="p">.</span><span class="n">prefecture_name</span><span class="w">      </span><span class="k">IS</span><span class="w"> </span><span class="s1">&#39;都道府県名&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">COMMENT</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">COLUMN</span><span class="w"> </span><span class="n">prefecture</span><span class="p">.</span><span class="n">prefecture_name_kana</span><span class="w"> </span><span class="k">IS</span><span class="w"> </span><span class="s1">&#39;都道府県名カナ&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">COMMENT</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">COLUMN</span><span class="w"> </span><span class="n">prefecture</span><span class="p">.</span><span class="n">prefecture_name_rome</span><span class="w"> </span><span class="k">IS</span><span class="w"> </span><span class="s1">&#39;都道府県名ローマ字&#39;</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p><code>COMMENT ON</code> は無くても動きますが、書いておくと <code>psql</code> や GUI ツールで日本語の説明が見えるようになるので、個人的には気に入っています。</p>
<blockquote>
<p><strong>【コラム】都道府県コードを <code>integer</code> にしてはいけない</strong></p>
<p>都道府県コードは <code>01</code>〜<code>47</code> です。数字に見えるので <code>integer</code> にしたくなりますが、<strong>絶対にやめましょう</strong>。<br>
<code>integer</code> に入れると <code>01</code> が <code>1</code> になってしまい、<strong>先頭のゼロが消えます</strong>。<code>01</code> でなければならない場面（他システムとの連携など）で必ず困ります。<br>
市区町村コード <code>01101</code> や郵便番号 <code>0010010</code> も同じです。<strong>数字に見えてもコードは文字列</strong>、と覚えておくと安全です。</p>
</blockquote>
<blockquote>
<p><strong>【コラム】<code>char</code> と <code>varchar</code> と <code>text</code></strong></p>
<p>PostgreSQL の文字列型は3つありますが、性能上の差はほとんどありません。使い分けの考え方はこうです。</p>
<ul>
<li><code>char(n)</code> … <strong>必ず n 文字</strong>になるもの。足りないぶんは空白で埋められます</li>
<li><code>varchar(n)</code> … n 文字<strong>まで</strong>のもの</li>
<li><code>text</code> … 上限を決めないもの</li>
</ul>
<p>今回、コード類は郵便住所.jp が「2文字（固定）」「5文字（固定）」「7文字（固定）」と明記しているので <code>char</code> にしています。<br>
一方、名前のほうは <code>text</code> にしました。郵便住所.jp のサイトにも最大文字数の一覧がありますが、「<strong>ある時点での情報となっており、名称などの最大文字数は増減します</strong>」と注意書きがあります。町域名は最大 252 文字とかなり長いものもあるので、無理に上限を決めずに <code>text</code> にしておくのが安全です。</p>
</blockquote>



<div class="gblog-post__anchorwrap">
    <h3 id="4-2-市区町村テーブルfk-あり">
        4-2. 市区町村テーブル（FK あり）
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#4-2-市区町村テーブルfk-あり" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 4-2. 市区町村テーブル（FK あり）" href="#4-2-%e5%b8%82%e5%8c%ba%e7%94%ba%e6%9d%91%e3%83%86%e3%83%bc%e3%83%96%e3%83%abfk-%e3%81%82%e3%82%8a">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">municipality</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">municipality_code</span><span class="w">      </span><span class="nb">char</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">municipality_name</span><span class="w">      </span><span class="nb">text</span><span class="w">    </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">municipality_name_kana</span><span class="w"> </span><span class="nb">text</span><span class="w">    </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">municipality_name_rome</span><span class="w"> </span><span class="nb">text</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">prefecture_code</span><span class="w">        </span><span class="nb">char</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">CONSTRAINT</span><span class="w"> </span><span class="n">pk_municipality</span><span class="w"> </span><span class="k">PRIMARY</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="p">(</span><span class="n">municipality_code</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">CONSTRAINT</span><span class="w"> </span><span class="n">fk_municipality_prefecture</span><span class="w"> </span><span class="k">FOREIGN</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="p">(</span><span class="n">prefecture_code</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">REFERENCES</span><span class="w"> </span><span class="n">prefecture</span><span class="w"> </span><span class="p">(</span><span class="n">prefecture_code</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">COMMENT</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">TABLE</span><span class="w">  </span><span class="n">municipality</span><span class="w">                        </span><span class="k">IS</span><span class="w"> </span><span class="s1">&#39;市区町村&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">COMMENT</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">COLUMN</span><span class="w"> </span><span class="n">municipality</span><span class="p">.</span><span class="n">municipality_code</span><span class="w">      </span><span class="k">IS</span><span class="w"> </span><span class="s1">&#39;市区町村コード&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">COMMENT</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">COLUMN</span><span class="w"> </span><span class="n">municipality</span><span class="p">.</span><span class="n">municipality_name</span><span class="w">      </span><span class="k">IS</span><span class="w"> </span><span class="s1">&#39;市区町村名&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">COMMENT</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">COLUMN</span><span class="w"> </span><span class="n">municipality</span><span class="p">.</span><span class="n">municipality_name_kana</span><span class="w"> </span><span class="k">IS</span><span class="w"> </span><span class="s1">&#39;市区町村名カナ&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">COMMENT</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">COLUMN</span><span class="w"> </span><span class="n">municipality</span><span class="p">.</span><span class="n">municipality_name_rome</span><span class="w"> </span><span class="k">IS</span><span class="w"> </span><span class="s1">&#39;市区町村名ローマ字&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">COMMENT</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">COLUMN</span><span class="w"> </span><span class="n">municipality</span><span class="p">.</span><span class="n">prefecture_code</span><span class="w">        </span><span class="k">IS</span><span class="w"> </span><span class="s1">&#39;都道府県コード&#39;</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p><code>FOREIGN KEY (prefecture_code) REFERENCES prefecture (prefecture_code)</code> の部分が<strong>外部キー制約 (FK)</strong> です。<br>
「<code>municipality.prefecture_code</code> には、<code>prefecture</code> テーブルに存在する都道府県コードしか入れられない」という制約になります。</p>
<p>これを付けておくと、</p>
<ul>
<li><code>prefecture</code> に無いコードを間違って入れようとすると<strong>エラーで止まってくれる</strong></li>
<li><code>prefecture</code> の行を消そうとしても、それを参照している市区町村があれば<strong>消せない</strong></li>
</ul>
<p>というふうに、データベースが不整合を防いでくれます。<br>
なお <code>municipality_name_rome</code> にだけ <code>NOT NULL</code> を付けていません。ローマ字は元データの更新が年1回のため、<strong>未設定のものがあり得る</strong>からです。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="4-3-郵便住所テーブルfk-あり">
        4-3. 郵便住所テーブル（FK あり）
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#4-3-郵便住所テーブルfk-あり" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 4-3. 郵便住所テーブル（FK あり）" href="#4-3-%e9%83%b5%e4%be%bf%e4%bd%8f%e6%89%80%e3%83%86%e3%83%bc%e3%83%96%e3%83%abfk-%e3%81%82%e3%82%8a">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">postal_address</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">id</span><span class="w">                </span><span class="nb">bigint</span><span class="w"> </span><span class="k">GENERATED</span><span class="w"> </span><span class="n">ALWAYS</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="k">IDENTITY</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">postal_code</span><span class="w">       </span><span class="nb">char</span><span class="p">(</span><span class="mi">7</span><span class="p">)</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">municipality_code</span><span class="w"> </span><span class="nb">char</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">street_name</span><span class="w">       </span><span class="nb">text</span><span class="w">    </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">street_name_kana</span><span class="w">  </span><span class="nb">text</span><span class="w">    </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">street_name_rome</span><span class="w">  </span><span class="nb">text</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">CONSTRAINT</span><span class="w"> </span><span class="n">pk_postal_address</span><span class="w"> </span><span class="k">PRIMARY</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="p">(</span><span class="n">id</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">CONSTRAINT</span><span class="w"> </span><span class="n">fk_postal_address_municipality</span><span class="w"> </span><span class="k">FOREIGN</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="p">(</span><span class="n">municipality_code</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">REFERENCES</span><span class="w"> </span><span class="n">municipality</span><span class="w"> </span><span class="p">(</span><span class="n">municipality_code</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">COMMENT</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">TABLE</span><span class="w">  </span><span class="n">postal_address</span><span class="w">                   </span><span class="k">IS</span><span class="w"> </span><span class="s1">&#39;郵便住所&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">COMMENT</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">COLUMN</span><span class="w"> </span><span class="n">postal_address</span><span class="p">.</span><span class="n">id</span><span class="w">                </span><span class="k">IS</span><span class="w"> </span><span class="s1">&#39;ID&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">COMMENT</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">COLUMN</span><span class="w"> </span><span class="n">postal_address</span><span class="p">.</span><span class="n">postal_code</span><span class="w">       </span><span class="k">IS</span><span class="w"> </span><span class="s1">&#39;郵便番号&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">COMMENT</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">COLUMN</span><span class="w"> </span><span class="n">postal_address</span><span class="p">.</span><span class="n">municipality_code</span><span class="w"> </span><span class="k">IS</span><span class="w"> </span><span class="s1">&#39;市区町村コード&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">COMMENT</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">COLUMN</span><span class="w"> </span><span class="n">postal_address</span><span class="p">.</span><span class="n">street_name</span><span class="w">       </span><span class="k">IS</span><span class="w"> </span><span class="s1">&#39;町域名&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">COMMENT</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">COLUMN</span><span class="w"> </span><span class="n">postal_address</span><span class="p">.</span><span class="n">street_name_kana</span><span class="w">  </span><span class="k">IS</span><span class="w"> </span><span class="s1">&#39;町域名カナ&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">COMMENT</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="k">COLUMN</span><span class="w"> </span><span class="n">postal_address</span><span class="p">.</span><span class="n">street_name_rome</span><span class="w">  </span><span class="k">IS</span><span class="w"> </span><span class="s1">&#39;町域名ローマ字&#39;</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p>ここで <code>id bigint GENERATED ALWAYS AS IDENTITY</code> という項目を足しています。<br>
これは<strong>自動採番される連番</strong>で、<code>1, 2, 3, ...</code> が勝手に入ります。</p>
<p>なぜこれが必要なのでしょうか。</p>
<blockquote>
<p><strong>【コラム】郵便番号は主キーにできない</strong></p>
<p>「郵便番号がユニークなんだから、<code>postal_code</code> を主キーにすればいいのでは？」と思いますよね。<strong>できません。</strong></p>
<p>郵便番号は、<strong>1つの郵便番号に複数の町域が対応する</strong>ことがあります。たとえば愛知県清須市の <code>4520961</code> は、<code>春日一本松</code>・<code>春日一番割</code>・<code>春日三番割</code>……と <strong>66 件</strong>もあります。<br>
実際、今回のデータでは <strong>1,261 件の郵便番号が複数行</strong>になっています。</p>
<p>では <code>(postal_code, municipality_code)</code> の組み合わせならどうか、というと<strong>これもダメ</strong>です。上の例のとおり、同じ郵便番号・同じ市区町村で町域だけが違う行が並ぶからです。この組み合わせでも 1,205 件が重複します。</p>
<p>このように<strong>データそのものの中に主キーにできる項目が無い</strong>場合、こちらで連番を振ってしまうのが定石です。こうした「意味を持たない、主キーにするためだけの項目」を**サロゲートキー（代理キー）**と呼びます。</p>
<p>ちなみに郵便住所.jp には「<strong>町域を集約する</strong>」というオプションがあって、これを ON にすると同じ郵便番号・市区町村の町域が <code>／</code> 区切りで1行にまとめられます。こちらを使えば <code>(postal_code, municipality_code)</code> を主キーにできます。用途に応じて選んでみてください。</p>
</blockquote>



<div class="gblog-post__anchorwrap">
    <h3 id="4-4-インデックスを作る">
        4-4. インデックスを作る
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#4-4-インデックスを作る" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 4-4. インデックスを作る" href="#4-4-%e3%82%a4%e3%83%b3%e3%83%87%e3%83%83%e3%82%af%e3%82%b9%e3%82%92%e4%bd%9c%e3%82%8b">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p>最後にインデックスを追加します。同じ <code>01_create_table.sql</code> の末尾に書きます。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">CREATE</span><span class="w"> </span><span class="k">INDEX</span><span class="w"> </span><span class="n">idx_municipality_prefecture_code</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="n">municipality</span><span class="w"> </span><span class="p">(</span><span class="n">prefecture_code</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">CREATE</span><span class="w"> </span><span class="k">INDEX</span><span class="w"> </span><span class="n">idx_postal_address_postal_code</span><span class="w">   </span><span class="k">ON</span><span class="w"> </span><span class="n">postal_address</span><span class="w"> </span><span class="p">(</span><span class="n">postal_code</span><span class="p">);</span><span class="w">
</span></span></span></code></pre></div><p>インデックスは、本でいうところの索引です。無くても検索はできますが、<strong>テーブルを頭から全部見に行く</strong>ことになるので遅くなります。</p>
<p>主キーには自動でインデックスが作られますが、<strong>それ以外の項目には作られません</strong>。<br>
今回でいうと <code>postal_address.postal_code</code> は主キーではないので、「郵便番号で住所を検索する」という<strong>いちばんやりたいこと</strong>が遅くなってしまいます。なので明示的に作っています。</p>
<p><code>municipality.prefecture_code</code> も「東京都の市区町村一覧を出す」ときに効いてきます。</p>
<hr>



<div class="gblog-post__anchorwrap">
    <h2 id="5-csv-をインポートする">
        5. CSV をインポートする
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#5-csv-をインポートする" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 5. CSV をインポートする" href="#5-csv-%e3%82%92%e3%82%a4%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%88%e3%81%99%e3%82%8b">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h2>
</div>

<p><code>initdb/02_import_csv.sql</code> を作成します。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="err">\</span><span class="k">copy</span><span class="w"> </span><span class="n">prefecture</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="s1">&#39;/csv/prefecture.csv&#39;</span><span class="w"> </span><span class="k">WITH</span><span class="w"> </span><span class="p">(</span><span class="n">FORMAT</span><span class="w"> </span><span class="n">csv</span><span class="p">,</span><span class="w"> </span><span class="k">ENCODING</span><span class="w"> </span><span class="s1">&#39;UTF8&#39;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">\</span><span class="k">copy</span><span class="w"> </span><span class="n">municipality</span><span class="w"> </span><span class="p">(</span><span class="n">municipality_code</span><span class="p">,</span><span class="w"> </span><span class="n">municipality_name</span><span class="p">,</span><span class="w"> </span><span class="n">municipality_name_kana</span><span class="p">,</span><span class="w"> </span><span class="n">municipality_name_rome</span><span class="p">,</span><span class="w"> </span><span class="n">prefecture_code</span><span class="p">)</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="s1">&#39;/csv/municipality.csv&#39;</span><span class="w"> </span><span class="k">WITH</span><span class="w"> </span><span class="p">(</span><span class="n">FORMAT</span><span class="w"> </span><span class="n">csv</span><span class="p">,</span><span class="w"> </span><span class="k">ENCODING</span><span class="w"> </span><span class="s1">&#39;UTF8&#39;</span><span class="p">,</span><span class="w"> </span><span class="n">FORCE_NULL</span><span class="w"> </span><span class="p">(</span><span class="n">municipality_name_rome</span><span class="p">))</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">\</span><span class="k">copy</span><span class="w"> </span><span class="n">postal_address</span><span class="w"> </span><span class="p">(</span><span class="n">postal_code</span><span class="p">,</span><span class="w"> </span><span class="n">municipality_code</span><span class="p">,</span><span class="w"> </span><span class="n">street_name</span><span class="p">,</span><span class="w"> </span><span class="n">street_name_kana</span><span class="p">,</span><span class="w"> </span><span class="n">street_name_rome</span><span class="p">)</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="s1">&#39;/csv/postal_address.csv&#39;</span><span class="w"> </span><span class="k">WITH</span><span class="w"> </span><span class="p">(</span><span class="n">FORMAT</span><span class="w"> </span><span class="n">csv</span><span class="p">,</span><span class="w"> </span><span class="k">ENCODING</span><span class="w"> </span><span class="s1">&#39;UTF8&#39;</span><span class="p">,</span><span class="w"> </span><span class="n">FORCE_NULL</span><span class="w"> </span><span class="p">(</span><span class="n">street_name_rome</span><span class="p">))</span><span class="w">
</span></span></span></code></pre></div><p>3行だけですが、ハマりどころが詰まっているので順番に説明します。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="copy-の書き方の注意">
        <code>\copy</code> の書き方の注意
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#copy-の書き方の注意" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor \copy の書き方の注意" href="#copy-%e3%81%ae%e6%9b%b8%e3%81%8d%e6%96%b9%e3%81%ae%e6%b3%a8%e6%84%8f">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p><code>\copy</code> は SQL ではなく、<strong><code>psql</code> のメタコマンド</strong>です（バックスラッシュで始まるコマンド）。そのため、普通の SQL とは書き方のルールが違い、<strong>1行で書く</strong>必要があります。途中で改行はできません。上の SQL が横に長いのはこのためです。</p>
<p>似たものに <code>COPY</code> という SQL 文もありますが、こちらは<strong>サーバ側</strong>のファイルを読みます。<br>
<code>\copy</code> は <strong><code>psql</code> を実行している側</strong>のファイルを読みます。スーパーユーザー権限が要らないので、こちらのほうが使える場面が多いです。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="ヘッダー行が無いので-header-は付けない">
        ヘッダー行が無いので <code>HEADER</code> は付けない
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#ヘッダー行が無いので-header-は付けない" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor ヘッダー行が無いので HEADER は付けない" href="#%e3%83%98%e3%83%83%e3%83%80%e3%83%bc%e8%a1%8c%e3%81%8c%e7%84%a1%e3%81%84%e3%81%ae%e3%81%a7-header-%e3%81%af%e4%bb%98%e3%81%91%e3%81%aa%e3%81%84">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p>CSV にヘッダー行があるときは <code>HEADER</code> を付けますが、郵便住所.jp の CSV には<strong>ヘッダー行がありません</strong>。なので付けません。<br>
うっかり付けると、1行目のデータが見出しとして読み飛ばされて、<strong>1件足りない</strong>という地味に気づきにくい事故になります。</p>
<p>ダブルクォート囲みについては、<code>FORMAT csv</code> を指定していれば PostgreSQL が自動的に外してくれるので、特に指定は不要です。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="id-があるテーブルは項目名を明示する">
        <code>id</code> があるテーブルは項目名を明示する
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#id-があるテーブルは項目名を明示する" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor id があるテーブルは項目名を明示する" href="#id-%e3%81%8c%e3%81%82%e3%82%8b%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e3%81%af%e9%a0%85%e7%9b%ae%e5%90%8d%e3%82%92%e6%98%8e%e7%a4%ba%e3%81%99%e3%82%8b">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p><code>prefecture</code> は CSV の項目とテーブルのカラムがぴったり一致しているので、テーブル名だけで済みます。</p>
<p>一方 <code>postal_address</code> には、CSV に存在しない <code>id</code> があります。<br>
このまま何も指定しないと「CSV の1列目を <code>id</code> に入れる」と解釈されて失敗するので、<strong>どのカラムに入れるかを明示</strong>します。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="err">\</span><span class="k">copy</span><span class="w"> </span><span class="n">postal_address</span><span class="w"> </span><span class="p">(</span><span class="n">postal_code</span><span class="p">,</span><span class="w"> </span><span class="n">municipality_code</span><span class="p">,</span><span class="w"> </span><span class="n">street_name</span><span class="p">,</span><span class="w"> </span><span class="n">street_name_kana</span><span class="p">,</span><span class="w"> </span><span class="n">street_name_rome</span><span class="p">)</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="p">...</span><span class="w">
</span></span></span></code></pre></div><p>こう書くと、指定しなかった <code>id</code> には <code>GENERATED ALWAYS AS IDENTITY</code> による連番が自動で入ります。</p>
<p><code>municipality</code> は一致していますが、わかりやすさのために同じく明示しています。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="force_null-で空文字を-null-にする">
        <code>FORCE_NULL</code> で空文字を NULL にする
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#force_null-で空文字を-null-にする" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor FORCE_NULL で空文字を NULL にする" href="#force_null-%e3%81%a7%e7%a9%ba%e6%96%87%e5%ad%97%e3%82%92-null-%e3%81%ab%e3%81%99%e3%82%8b">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p>郵便住所.jp の CSV では、値が無い項目は <code>&quot;&quot;</code>（空文字）になっています。<br>
たとえば町域名ローマ字が未設定の行はこうなっています。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl"><span class="s2">&#34;0130310&#34;</span>,<span class="s2">&#34;05203&#34;</span>,<span class="s2">&#34;大雄佐加里西&#34;</span>,<span class="s2">&#34;タイユウサガリニシ&#34;</span>,<span class="s2">&#34;&#34;</span>
</span></span></code></pre></div><p>このまま取り込むと <code>street_name_rome</code> には<strong>空文字が入ります</strong>。<code>NULL</code> にはなりません。</p>
<p>「値が無い」ことを <code>NULL</code> で表したい場合は <strong><code>FORCE_NULL</code></strong> を使います。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">WITH</span><span class="w"> </span><span class="p">(</span><span class="n">FORMAT</span><span class="w"> </span><span class="n">csv</span><span class="p">,</span><span class="w"> </span><span class="k">ENCODING</span><span class="w"> </span><span class="s1">&#39;UTF8&#39;</span><span class="p">,</span><span class="w"> </span><span class="n">FORCE_NULL</span><span class="w"> </span><span class="p">(</span><span class="n">street_name_rome</span><span class="p">))</span><span class="w">
</span></span></span></code></pre></div><p>こう書くと、<code>&quot;&quot;</code> が <code>NULL</code> として取り込まれます。<br>
空文字と <code>NULL</code> が混ざっていると <code>WHERE street_name_rome IS NULL</code> では引っかからない、といった面倒が起きるので、<strong>どちらかに寄せておく</strong>のがおすすめです。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="取り込む順番に注意">
        取り込む順番に注意
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#取り込む順番に注意" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 取り込む順番に注意" href="#%e5%8f%96%e3%82%8a%e8%be%bc%e3%82%80%e9%a0%86%e7%95%aa%e3%81%ab%e6%b3%a8%e6%84%8f">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p>FK があるので、<strong>親から先に入れる</strong>必要があります。</p>
<p><code>prefecture</code> → <code>municipality</code> → <code>postal_address</code> の順です。<br>
逆の順番で入れようとすると、参照先がまだ存在しないので FK 違反でエラーになります。<br>
<code>01_</code> <code>02_</code> と同じく、<strong>SQL の中の並び順がそのまま実行順</strong>になるので、この順で書いておけば大丈夫です。</p>
<hr>



<div class="gblog-post__anchorwrap">
    <h2 id="6-起動して確認する">
        6. 起動して確認する
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#6-起動して確認する" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 6. 起動して確認する" href="#6-%e8%b5%b7%e5%8b%95%e3%81%97%e3%81%a6%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h2>
</div>

<p>準備ができました。ファイルはこうなっているはずです。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">testing-postgresql-docker/
</span></span><span class="line"><span class="cl">├── docker-compose.yml
</span></span><span class="line"><span class="cl">├── csv/
</span></span><span class="line"><span class="cl">│   ├── prefecture.csv
</span></span><span class="line"><span class="cl">│   ├── municipality.csv
</span></span><span class="line"><span class="cl">│   └── postal_address.csv
</span></span><span class="line"><span class="cl">└── initdb/
</span></span><span class="line"><span class="cl">    ├── 01_create_table.sql
</span></span><span class="line"><span class="cl">    └── 02_import_csv.sql
</span></span></code></pre></div><p>Docker Desktop を起動してから、<code>docker compose up -d</code> を実行します。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">C<span class="p">:</span><span class="nl">\Users\Kuma\testing-postgresql-docker</span><span class="c1">&gt; docker compose up -d</span>
</span></span></code></pre></div><p>12万件の取り込みがあるので、少し時間がかかります。<br>
ログを見て、初期化が終わったか確認しましょう。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">C<span class="p">:</span><span class="nl">\Users\Kuma\testing-postgresql-docker</span><span class="c1">&gt; docker compose logs postgres</span>
</span></span></code></pre></div><p><code>PostgreSQL init process complete; ready for start up.</code> と出ていれば成功です。<br>
<code>ERROR</code> の文字が無いこともあわせて確認しておくと安心です。</p>
<p>では、<code>psql</code> でつないでみます。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">C<span class="p">:</span><span class="nl">\Users\Kuma\testing-postgresql-docker</span><span class="c1">&gt; docker compose exec postgres psql -U postgres -d postaladdress</span>
</span></span></code></pre></div><p><code>\dt</code> でテーブルの一覧が見られます。3つできていれば成功です。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="n">postaladdress</span><span class="o">=#</span><span class="w"> </span><span class="err">\</span><span class="n">dt</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">             </span><span class="n">List</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">relations</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">Schema</span><span class="w"> </span><span class="o">|</span><span class="w">      </span><span class="n">Name</span><span class="w">      </span><span class="o">|</span><span class="w"> </span><span class="k">Type</span><span class="w">  </span><span class="o">|</span><span class="w">  </span><span class="k">Owner</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">--------+----------------+-------+----------
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">municipality</span><span class="w">   </span><span class="o">|</span><span class="w"> </span><span class="k">table</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">postgres</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">postal_address</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">table</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">postgres</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">prefecture</span><span class="w">     </span><span class="o">|</span><span class="w"> </span><span class="k">table</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">postgres</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="mi">3</span><span class="w"> </span><span class="k">rows</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><p>件数も確認してみましょう。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="n">postaladdress</span><span class="o">=#</span><span class="w"> </span><span class="k">SELECT</span><span class="w"> </span><span class="k">count</span><span class="p">(</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">prefecture</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">count</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-------
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w">    </span><span class="mi">47</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="mi">1</span><span class="w"> </span><span class="k">row</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">postaladdress</span><span class="o">=#</span><span class="w"> </span><span class="k">SELECT</span><span class="w"> </span><span class="k">count</span><span class="p">(</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">municipality</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">count</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-------
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w">  </span><span class="mi">1892</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="mi">1</span><span class="w"> </span><span class="k">row</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">postaladdress</span><span class="o">=#</span><span class="w"> </span><span class="k">SELECT</span><span class="w"> </span><span class="k">count</span><span class="p">(</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">postal_address</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">count</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">--------
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="mi">122653</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="mi">1</span><span class="w"> </span><span class="k">row</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><p>47 件・1,892 件・122,653 件。郵便住所.jp のサイトに表示されている件数と一致しました🎉</p>
<hr>



<div class="gblog-post__anchorwrap">
    <h2 id="7-select-文の例">
        7. SELECT 文の例
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#7-select-文の例" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 7. SELECT 文の例" href="#7-select-%e6%96%87%e3%81%ae%e4%be%8b">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h2>
</div>

<p>せっかくデータが入ったので、いろいろ検索してみましょう。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="都道府県の一覧を取得する">
        都道府県の一覧を取得する
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#都道府県の一覧を取得する" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 都道府県の一覧を取得する" href="#%e9%83%bd%e9%81%93%e5%ba%9c%e7%9c%8c%e3%81%ae%e4%b8%80%e8%a6%a7%e3%82%92%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p>いちばん単純な SELECT です。プルダウンを作るときなどはこれで十分です。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="n">prefecture_code</span><span class="p">,</span><span class="w"> </span><span class="n">prefecture_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">FROM</span><span class="w"> </span><span class="n">prefecture</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">prefecture_code</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="w"> </span><span class="n">prefecture_code</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">prefecture_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-----------------+-----------------
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="mi">01</span><span class="w">              </span><span class="o">|</span><span class="w"> </span><span class="err">北海道</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="mi">02</span><span class="w">              </span><span class="o">|</span><span class="w"> </span><span class="err">青森県</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="mi">03</span><span class="w">              </span><span class="o">|</span><span class="w"> </span><span class="err">岩手県</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="mi">47</span><span class="w">              </span><span class="o">|</span><span class="w"> </span><span class="err">沖縄県</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="mi">47</span><span class="w"> </span><span class="k">rows</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div>


<div class="gblog-post__anchorwrap">
    <h3 id="指定した都道府県の市区町村の一覧を取得する">
        指定した都道府県の市区町村の一覧を取得する
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#指定した都道府県の市区町村の一覧を取得する" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 指定した都道府県の市区町村の一覧を取得する" href="#%e6%8c%87%e5%ae%9a%e3%81%97%e3%81%9f%e9%83%bd%e9%81%93%e5%ba%9c%e7%9c%8c%e3%81%ae%e5%b8%82%e5%8c%ba%e7%94%ba%e6%9d%91%e3%81%ae%e4%b8%80%e8%a6%a7%e3%82%92%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p>ここで FK を張った <code>prefecture_code</code> が効いてきます。<br>
都道府県名で絞り込みたいので、<code>prefecture</code> と JOIN します。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="n">m</span><span class="p">.</span><span class="n">municipality_code</span><span class="p">,</span><span class="w"> </span><span class="n">m</span><span class="p">.</span><span class="n">municipality_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">FROM</span><span class="w"> </span><span class="n">municipality</span><span class="w"> </span><span class="n">m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">JOIN</span><span class="w"> </span><span class="n">prefecture</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="n">prefecture_code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">m</span><span class="p">.</span><span class="n">prefecture_code</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="n">prefecture_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;東京都&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">m</span><span class="p">.</span><span class="n">municipality_code</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="w"> </span><span class="n">municipality_code</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">municipality_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-------------------+-------------------
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="mi">13101</span><span class="w">             </span><span class="o">|</span><span class="w"> </span><span class="err">千代田区</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="mi">13102</span><span class="w">             </span><span class="o">|</span><span class="w"> </span><span class="err">中央区</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="mi">13103</span><span class="w">             </span><span class="o">|</span><span class="w"> </span><span class="err">港区</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="mi">62</span><span class="w"> </span><span class="k">rows</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><p><code>municipality</code> に都道府県名を持たせなかったのは、こうやって JOIN で取れるからです。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="郵便番号から住所を取得する">
        郵便番号から住所を取得する
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#郵便番号から住所を取得する" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 郵便番号から住所を取得する" href="#%e9%83%b5%e4%be%bf%e7%95%aa%e5%8f%b7%e3%81%8b%e3%82%89%e4%bd%8f%e6%89%80%e3%82%92%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p>いちばんやりたいことです。3つのテーブルを JOIN します。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">postal_code</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">       </span><span class="n">p</span><span class="p">.</span><span class="n">prefecture_name</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">       </span><span class="n">m</span><span class="p">.</span><span class="n">municipality_name</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">       </span><span class="n">a</span><span class="p">.</span><span class="n">street_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">FROM</span><span class="w"> </span><span class="n">postal_address</span><span class="w"> </span><span class="n">a</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">JOIN</span><span class="w"> </span><span class="n">municipality</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="n">m</span><span class="p">.</span><span class="n">municipality_code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">municipality_code</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">JOIN</span><span class="w"> </span><span class="n">prefecture</span><span class="w">   </span><span class="n">p</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="n">prefecture_code</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="n">m</span><span class="p">.</span><span class="n">prefecture_code</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">postal_code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;1000001&#39;</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="w"> </span><span class="n">postal_code</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">prefecture_name</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">municipality_name</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">street_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-------------+-----------------+-------------------+-------------
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="mi">1000001</span><span class="w">     </span><span class="o">|</span><span class="w"> </span><span class="err">東京都</span><span class="w">          </span><span class="o">|</span><span class="w"> </span><span class="err">千代田区</span><span class="w">          </span><span class="o">|</span><span class="w"> </span><span class="err">千代田</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="mi">1</span><span class="w"> </span><span class="k">row</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><p>郵便番号 <code>1000001</code> から「東京都 千代田区 千代田」が取得できました。<br>
入力フォームの住所自動補完は、まさにこの SELECT です。</p>
<p>なお、郵便番号にハイフンは入っていません。<br>
画面から <code>100-0001</code> という形式で受け取る場合は、検索する前にハイフンを取り除いてください。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="住所から郵便番号を検索する">
        住所から郵便番号を検索する
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#住所から郵便番号を検索する" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 住所から郵便番号を検索する" href="#%e4%bd%8f%e6%89%80%e3%81%8b%e3%82%89%e9%83%b5%e4%be%bf%e7%95%aa%e5%8f%b7%e3%82%92%e6%a4%9c%e7%b4%a2%e3%81%99%e3%82%8b">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p>逆向きの検索です。町域名の部分一致で探します。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">postal_code</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">       </span><span class="n">p</span><span class="p">.</span><span class="n">prefecture_name</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">       </span><span class="n">m</span><span class="p">.</span><span class="n">municipality_name</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">       </span><span class="n">a</span><span class="p">.</span><span class="n">street_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">FROM</span><span class="w"> </span><span class="n">postal_address</span><span class="w"> </span><span class="n">a</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">JOIN</span><span class="w"> </span><span class="n">municipality</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="n">m</span><span class="p">.</span><span class="n">municipality_code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">municipality_code</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">JOIN</span><span class="w"> </span><span class="n">prefecture</span><span class="w">   </span><span class="n">p</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="n">prefecture_code</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="n">m</span><span class="p">.</span><span class="n">prefecture_code</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="n">m</span><span class="p">.</span><span class="n">municipality_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;千代田区&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">   </span><span class="k">AND</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">street_name</span><span class="w"> </span><span class="k">LIKE</span><span class="w"> </span><span class="s1">&#39;大手町%&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">postal_code</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="w"> </span><span class="n">postal_code</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">prefecture_name</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">municipality_name</span><span class="w"> </span><span class="o">|</span><span class="w">           </span><span class="n">street_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-------------+-----------------+-------------------+----------------------------------
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="mi">1000004</span><span class="w">     </span><span class="o">|</span><span class="w"> </span><span class="err">東京都</span><span class="w">          </span><span class="o">|</span><span class="w"> </span><span class="err">千代田区</span><span class="w">          </span><span class="o">|</span><span class="w"> </span><span class="err">大手町（次のビルを除く）</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="mi">1006801</span><span class="w">     </span><span class="o">|</span><span class="w"> </span><span class="err">東京都</span><span class="w">          </span><span class="o">|</span><span class="w"> </span><span class="err">千代田区</span><span class="w">          </span><span class="o">|</span><span class="w"> </span><span class="err">大手町ＪＡビル（１階）</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="mi">1006802</span><span class="w">     </span><span class="o">|</span><span class="w"> </span><span class="err">東京都</span><span class="w">          </span><span class="o">|</span><span class="w"> </span><span class="err">千代田区</span><span class="w">          </span><span class="o">|</span><span class="w"> </span><span class="err">大手町ＪＡビル（２階）</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="mi">1006890</span><span class="w">     </span><span class="o">|</span><span class="w"> </span><span class="err">東京都</span><span class="w">          </span><span class="o">|</span><span class="w"> </span><span class="err">千代田区</span><span class="w">          </span><span class="o">|</span><span class="w"> </span><span class="err">大手町ＪＡビル（地階・階層不明）</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="mi">39</span><span class="w"> </span><span class="k">rows</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><p>大きなビルは階ごとに郵便番号が振られているんですね。</p>
<p><code>LIKE '大手町%'</code> は「大手町で始まる」という意味です。<br>
<code>LIKE '%大手町%'</code> のように前後に <code>%</code> を付けると「大手町を含む」になります。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="都道府県ごとの郵便番号の件数を数える">
        都道府県ごとの郵便番号の件数を数える
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#都道府県ごとの郵便番号の件数を数える" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 都道府県ごとの郵便番号の件数を数える" href="#%e9%83%bd%e9%81%93%e5%ba%9c%e7%9c%8c%e3%81%94%e3%81%a8%e3%81%ae%e9%83%b5%e4%be%bf%e7%95%aa%e5%8f%b7%e3%81%ae%e4%bb%b6%e6%95%b0%e3%82%92%e6%95%b0%e3%81%88%e3%82%8b">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p>集計してみます。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="n">prefecture_name</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">       </span><span class="k">count</span><span class="p">(</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">address_count</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">FROM</span><span class="w"> </span><span class="n">postal_address</span><span class="w"> </span><span class="n">a</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">JOIN</span><span class="w"> </span><span class="n">municipality</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="n">m</span><span class="p">.</span><span class="n">municipality_code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">municipality_code</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">JOIN</span><span class="w"> </span><span class="n">prefecture</span><span class="w">   </span><span class="n">p</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="n">prefecture_code</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="n">m</span><span class="p">.</span><span class="n">prefecture_code</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="n">prefecture_code</span><span class="p">,</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="n">prefecture_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">address_count</span><span class="w"> </span><span class="k">DESC</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">LIMIT</span><span class="w"> </span><span class="mi">5</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="w"> </span><span class="n">prefecture_name</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">address_count</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-----------------+---------------
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="err">北海道</span><span class="w">          </span><span class="o">|</span><span class="w">          </span><span class="mi">8002</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">愛知県</span><span class="w">          </span><span class="o">|</span><span class="w">          </span><span class="mi">7666</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">京都府</span><span class="w">          </span><span class="o">|</span><span class="w">          </span><span class="mi">6421</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">新潟県</span><span class="w">          </span><span class="o">|</span><span class="w">          </span><span class="mi">5451</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">兵庫県</span><span class="w">          </span><span class="o">|</span><span class="w">          </span><span class="mi">5179</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="mi">5</span><span class="w"> </span><span class="k">rows</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><p><code>GROUP BY</code> に <code>prefecture_code</code> も入れておくと、同じ名前の都道府県があった場合でも正しくまとまります（実際には無いのですが、癖にしておくと安全です）。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="1つの郵便番号に複数の町域があるものを探す">
        1つの郵便番号に複数の町域があるものを探す
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#1つの郵便番号に複数の町域があるものを探す" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 1つの郵便番号に複数の町域があるものを探す" href="#1%e3%81%a4%e3%81%ae%e9%83%b5%e4%be%bf%e7%95%aa%e5%8f%b7%e3%81%ab%e8%a4%87%e6%95%b0%e3%81%ae%e7%94%ba%e5%9f%9f%e3%81%8c%e3%81%82%e3%82%8b%e3%82%82%e3%81%ae%e3%82%92%e6%8e%a2%e3%81%99">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p>先ほどコラムで触れた、サロゲートキーが必要になる理由を実際に見てみましょう。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="n">postal_code</span><span class="p">,</span><span class="w"> </span><span class="k">count</span><span class="p">(</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">street_count</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">FROM</span><span class="w"> </span><span class="n">postal_address</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">postal_code</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">HAVING</span><span class="w"> </span><span class="k">count</span><span class="p">(</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">street_count</span><span class="w"> </span><span class="k">DESC</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">LIMIT</span><span class="w"> </span><span class="mi">5</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="w"> </span><span class="n">postal_code</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">street_count</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-------------+--------------
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="mi">4520961</span><span class="w">     </span><span class="o">|</span><span class="w">           </span><span class="mi">66</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="mi">4801103</span><span class="w">     </span><span class="o">|</span><span class="w">           </span><span class="mi">65</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="mi">4410302</span><span class="w">     </span><span class="o">|</span><span class="w">           </span><span class="mi">46</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="mi">7793405</span><span class="w">     </span><span class="o">|</span><span class="w">           </span><span class="mi">44</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="mi">0294205</span><span class="w">     </span><span class="o">|</span><span class="w">           </span><span class="mi">42</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="mi">5</span><span class="w"> </span><span class="k">rows</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><p><code>WHERE</code> ではなく <code>HAVING</code> を使っているところがポイントです。<br>
<code>WHERE</code> は集計する<strong>前</strong>の行を絞り込むもので、<code>HAVING</code> は集計した<strong>後</strong>の結果を絞り込むものです。<code>count(*)</code> は集計した後にしか決まらないので、<code>HAVING</code> を使います。</p>
<p>いちばん多い <code>4520961</code> の中身も見てみます。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="n">postal_code</span><span class="p">,</span><span class="w"> </span><span class="n">street_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">FROM</span><span class="w"> </span><span class="n">postal_address</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="n">postal_code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;4520961&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">street_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">LIMIT</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="w"> </span><span class="n">postal_code</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">street_name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-------------+-------------
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="mi">4520961</span><span class="w">     </span><span class="o">|</span><span class="w"> </span><span class="err">春日一本松</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="mi">4520961</span><span class="w">     </span><span class="o">|</span><span class="w"> </span><span class="err">春日一番割</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="mi">4520961</span><span class="w">     </span><span class="o">|</span><span class="w"> </span><span class="err">春日三番割</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="mi">3</span><span class="w"> </span><span class="k">rows</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><p>同じ郵便番号に町域が 66 件ぶら下がっていることがわかります。<br>
これが「郵便番号を主キーにできない」理由です。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="ローマ字が設定されていない住所を探す">
        ローマ字が設定されていない住所を探す
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#ローマ字が設定されていない住所を探す" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor ローマ字が設定されていない住所を探す" href="#%e3%83%ad%e3%83%bc%e3%83%9e%e5%ad%97%e3%81%8c%e8%a8%ad%e5%ae%9a%e3%81%95%e3%82%8c%e3%81%a6%e3%81%84%e3%81%aa%e3%81%84%e4%bd%8f%e6%89%80%e3%82%92%e6%8e%a2%e3%81%99">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p><code>FORCE_NULL</code> が効いているか確認してみましょう。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="k">count</span><span class="p">(</span><span class="o">*</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="k">FROM</span><span class="w"> </span><span class="n">postal_address</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="n">street_name_rome</span><span class="w"> </span><span class="k">IS</span><span class="w"> </span><span class="k">NULL</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="w"> </span><span class="k">count</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-------
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w">   </span><span class="mi">177</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(</span><span class="mi">1</span><span class="w"> </span><span class="k">row</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><p>177 件が <code>NULL</code> になっています。<code>FORCE_NULL</code> を書かなかった場合、ここは <code>0</code> になります（空文字が入っているため）。</p>
<hr>



<div class="gblog-post__anchorwrap">
    <h2 id="8-うまくいかないときは">
        8. うまくいかないときは
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#8-うまくいかないときは" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 8. うまくいかないときは" href="#8-%e3%81%86%e3%81%be%e3%81%8f%e3%81%84%e3%81%8b%e3%81%aa%e3%81%84%e3%81%a8%e3%81%8d%e3%81%af">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h2>
</div>




<div class="gblog-post__anchorwrap">
    <h3 id="やり直したい">
        やり直したい
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#やり直したい" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor やり直したい" href="#%e3%82%84%e3%82%8a%e7%9b%b4%e3%81%97%e3%81%9f%e3%81%84">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p><code>/docker-entrypoint-initdb.d</code> の SQL は、<strong>データベースがまだ存在しない初回起動時にしか実行されません</strong>。<br>
SQL を修正してコンテナを再起動しても、<strong>何も起こりません</strong>。ここは最初に必ずハマるところです。</p>
<p>やり直すときは、ボリュームごと削除してから起動し直します。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">C<span class="p">:</span><span class="nl">\Users\Kuma\testing-postgresql-docker</span><span class="c1">&gt; docker compose down -v</span>
</span></span><span class="line"><span class="cl">C<span class="p">:</span><span class="nl">\Users\Kuma\testing-postgresql-docker</span><span class="c1">&gt; docker compose up -d</span>
</span></span></code></pre></div><p><code>-v</code> がボリュームを消すオプションです。これを付けないとデータが残ったままなので、忘れないようにしましょう。<br>
検証用の環境なので、気軽に壊して作り直せます。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="error-missing-data-for-column-">
        <code>ERROR: missing data for column &quot;...&quot;</code>
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#error-missing-data-for-column-" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor ERROR: missing data for column &quot;...&quot;" href="#error-missing-data-for-column-">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p>テーブルのカラム数に対して、CSV の項目が足りていません。<br>
ダウンロードするときに、<strong>チェックを付け忘れた項目が無いか</strong>を確認してみてください。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="error-value-too-long-for-type-character5">
        <code>ERROR: value too long for type character(5)</code>
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#error-value-too-long-for-type-character5" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor ERROR: value too long for type character(5)" href="#error-value-too-long-for-type-character5">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p><code>\copy</code> に<strong>カラム名のリストを書き忘れている</strong>可能性が高いです。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">ERROR:  value too long for type character(5)
</span></span><span class="line"><span class="cl">CONTEXT:  COPY postal_address, line 1, column municipality_code: <span class="s2">&#34;北十条西（１～４丁目）&#34;</span>
</span></span></code></pre></div><p>書き忘れると CSV の1列目が <code>id</code> に入り、以降が1つずつずれます。<br>
その結果、3列目の町域名が <code>char(5)</code> の <code>municipality_code</code> に入ろうとして、このエラーになります。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="error-insert-or-update-on-table--violates-foreign-key-constraint">
        <code>ERROR: insert or update on table ... violates foreign key constraint</code>
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#error-insert-or-update-on-table--violates-foreign-key-constraint" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor ERROR: insert or update on table ... violates foreign key constraint" href="#error-insert-or-update-on-table--violates-foreign-key-constraint">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p>FK 違反です。参照先に無いコードを入れようとしています。</p>
<ul>
<li>CSV をダウンロードするときに、<strong>片方だけ「廃止データを含める」にチェックを入れていないか</strong></li>
<li>取り込む順番が <code>prefecture</code> → <code>municipality</code> → <code>postal_address</code> になっているか</li>
</ul>
<p>このあたりを確認してみてください。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="error-extra-data-after-last-expected-column">
        <code>ERROR: extra data after last expected column</code>
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#error-extra-data-after-last-expected-column" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor ERROR: extra data after last expected column" href="#error-extra-data-after-last-expected-column">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p>CSV の項目数とテーブルのカラム数が合っていません。<br>
<strong>ダウンロードするときのチェックの付け方</strong>を、もう一度この記事の表と見比べてみてください。最初から ON になっている項目を外し忘れているケースが多いです。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="error-could-not-open-file-csvprefecturecsv-for-reading">
        <code>ERROR: could not open file &quot;/csv/prefecture.csv&quot; for reading</code>
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#error-could-not-open-file-csvprefecturecsv-for-reading" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor ERROR: could not open file &quot;/csv/prefecture.csv&quot; for reading" href="#error-could-not-open-file-csvprefecturecsv-for-reading">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p>CSV がコンテナから見えていません。<br>
<code>csv</code> ディレクトリの場所と、リネームしたファイル名を確認してみてください。</p>



<div class="gblog-post__anchorwrap">
    <h3 id="日本語が文字化けする">
        日本語が文字化けする
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#日本語が文字化けする" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 日本語が文字化けする" href="#%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%81%8c%e6%96%87%e5%ad%97%e5%8c%96%e3%81%91%e3%81%99%e3%82%8b">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h3>
</div>

<p>Windows のコマンドプロンプトで <code>psql</code> を使うと文字化けすることがあります。<br>
<code>psql</code> を実行する前に、文字コードを UTF-8 に切り替えてみてください。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">C<span class="p">:</span><span class="nl">\Users\Kuma</span><span class="c1">&gt; chcp 65001</span>
</span></span></code></pre></div><hr>



<div class="gblog-post__anchorwrap">
    <h2 id="最後に">
        最後に
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#最後に" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 最後に" href="#%e6%9c%80%e5%be%8c%e3%81%ab">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h2>
</div>

<p>郵便住所.jp の CSV を PostgreSQL に取り込んで、住所マスタとして使えるところまでを見てきました。</p>
<p>「欲しい項目だけ選べる」というのは地味な機能に見えるかもしれませんが、<strong>テーブルのカラム構成に合わせて CSV を作れる</strong>ので、取り込みの前処理がほとんど不要になります。今回も <code>\copy</code> 3行で終わりました。</p>
<p>データは月に1回ほど更新されるので、テーブルを作り直して入れ直せば、いつでも最新の状態に保てます。<br>
ぜひ <a class="gblog-post__link" href="https://postaladdress.jp/">郵便住所.jp</a>
 を使ってみてください。</p>
<p>それではまた次回！</p>
<hr>



<div class="gblog-post__anchorwrap">
    <h2 id="参考リンク">
        参考リンク
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#参考リンク" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 参考リンク" href="#%e5%8f%82%e8%80%83%e3%83%aa%e3%83%b3%e3%82%af">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h2>
</div>

<ul>
<li><a class="gblog-post__link" href="https://postaladdress.jp/">郵便住所.jp</a>
</li>
<li><a class="gblog-post__link" href="https://postaladdress.jp/terms">郵便住所.jp 利用規約</a>
</li>
<li><a class="gblog-post__link" href="https://github.com/interfamilia/testing-postgresql-docker">interfamilia/testing-postgresql-docker</a>
</li>
<li><a class="gblog-post__link" href="https://www.post.japanpost.jp/service/search/zipcode/download/">郵便番号データダウンロード - 日本郵便</a>
</li>
<li><a class="gblog-post__link" href="https://www.postgresql.jp/document/current/html/sql-copy.html">PostgreSQL 文書 - COPY</a>
</li>
<li><a class="gblog-post__link" href="https://www.postgresql.jp/document/current/html/app-psql.html">PostgreSQL 文書 - psql</a>
</li>
<li><a class="gblog-post__link" href="https://www.postgresql.jp/document/current/html/datatype-character.html">PostgreSQL 文書 - 文字型</a>
</li>
<li><a class="gblog-post__link" href="https://hub.docker.com/_/postgres">postgres - Docker Official Image</a>
</li>
</ul>
<hr>



<div class="gblog-post__anchorwrap">
    <h2 id="会社を一緒に盛り上げてくれる仲間を募集しています">
        会社を一緒に盛り上げてくれる仲間を募集しています！
        <a data-clipboard-text="https://blog.interfamilia.co.jp/2026/09/08/PostgreSQL-%E3%81%A7%E4%BD%8F%E6%89%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B-%E9%83%B5%E4%BE%BF%E4%BD%8F%E6%89%80.jp-%E3%81%AE-CSV-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6/#会社を一緒に盛り上げてくれる仲間を募集しています" class="gblog-post__anchor gblog-post__anchor--right clip" aria-label="Anchor 会社を一緒に盛り上げてくれる仲間を募集しています！" href="#%e4%bc%9a%e7%a4%be%e3%82%92%e4%b8%80%e7%b7%92%e3%81%ab%e7%9b%9b%e3%82%8a%e4%b8%8a%e3%81%92%e3%81%a6%e3%81%8f%e3%82%8c%e3%82%8b%e4%bb%b2%e9%96%93%e3%82%92%e5%8b%9f%e9%9b%86%e3%81%97%e3%81%a6%e3%81%84%e3%81%be%e3%81%99">
            <svg class="icon link"><use xlink:href="#link"></use></svg>
        </a>
    </h2>
</div>

<p>応募フォームには、外部サービスengageを利用しています。<br>
ご応募に際して、何かわからないことなどございましたら <a class="gblog-post__link" href="https://interfamilia.co.jp/contact/">こちら</a>
 からお気軽にお問い合わせください。</p>
<p><a href="" class="engage-recruit-widget" data-height="350" data-width="100%" data-url="https://en-gage.net/interfamilia/widget/" target="_blank"></a><script src="https://en-gage.net/common/company_script/recruit/widget.js"></script></p>]]></content><category scheme="https://blog.interfamilia.co.jp/authors/kuma" term="kuma" label="kuma"/><category scheme="https://blog.interfamilia.co.jp/tags/PostgreSQL" term="PostgreSQL" label="PostgreSQL"/><category scheme="https://blog.interfamilia.co.jp/tags/Docker" term="Docker" label="Docker"/><category scheme="https://blog.interfamilia.co.jp/tags/For-Beginners" term="For-Beginners" label="For Beginners"/></entry></feed>