都道府県を別の表に切り出す
kaiin_nama は主キーが kaiin_id ですが、pref_mei は pref_code で決まってしまい、同じ都道府県名が何度も入っています。これを 2 つの表に分けてください。todofuken は pref_code が整数で主キー、pref_mei が text で NULL を許さない、の 2 列。kaiin は kaiin_id が整数で主キー、kaiin_mei が text で NULL を許さない、pref_code が整数で NULL を許さず todofuken を参照する外部キー、の 3 列です。どちらも列はこの順です。kaiin_nama の中身を、重複なく両方の表へ移してください。
この書き方が使えない製品があります そのまま使える: PostgreSQL / MySQL / MariaDB / SQLite / SQL Server
- Oracle Database では使えません(text 型の列) / この問題のほかの構文は未確認です
未確認: IBM Db2
- Oracle Database には text 型がありません。pref_mei は VARCHAR2 や CLOB に読み替えてください(公式のデータ型の一覧で確認)。
この問題で使えるテーブル(名前をタップすると入力できます)
8 行
| 列 | 型 | NULL |
|---|---|---|
| 🔑 | int | 不可 |
| 🔑 | int | 不可 |
| text | 不可 | |
| numeric(10,0) | 不可 | |
| int | 不可 |
データを見る(先頭 5 行)
| juchu_id | shohin_id | shohin_mei | tanka | suryo |
|---|---|---|---|---|
| 1 | 10 | pen | 120 | 3 |
| 1 | 11 | note | 200 | 2 |
| 2 | 10 | pen | 120 | 5 |
| 2 | 12 | eraser | 80 | 1 |
| 3 | 11 | note | 200 | 4 |
6 行
| 列 | 型 | NULL |
|---|---|---|
| 🔑 | int | 不可 |
| text | 不可 | |
| int | 不可 | |
| text | 不可 |
データを見る(先頭 5 行)
| kaiin_id | kaiin_mei | pref_code | pref_mei |
|---|---|---|---|
| 1 | sato | 13 | tokyo |
| 2 | suzuki | 27 | osaka |
| 3 | takahashi | 13 | tokyo |
| 4 | tanaka | 23 | aichi |
| 5 | ito | 27 | osaka |
解説
結論
主キー以外の列から決まる列も、別の表に切り出します。
★第 2 正規形との違い
前の問題は「主キーの一部だけで決まる列」でした。今回は主キーではない pref_code から pref_mei が決まっています。kaiin_id → pref_code → pref_mei と 2 段になっているので、推移的関数従属と呼びます。決まり方が 2 段になっていたら切り出す、と覚えてください。
★何が問題だったのか
東京の会員が 3 人いるので、'tokyo' が 3 行に書かれていました。表記を 'Tokyo' に直したいとき、3 行とも直さなければなりません。切り出した後は 1 行で済みます。
★都道府県コードのように「外の世界で決まっている値」は、切り出すと特に効きます。コード表として独立させておけば、名前が変わっても 1 か所を直すだけで全体に反映されます。
⚠️ この問題では分解後の表名と列名を指定しています。分け方そのものは何通りもあり得るので、指定が無いと採点できないためです。実際の設計では、この「どう分けるか」が判断のしどころになります。
根拠(一次情報)
- PostgreSQL 18 マニュアル: CREATE TABLE一次情報・確認 2026-09-03
- PostgreSQL 18 マニュアル: INSERT(問い合わせの結果を入れる)一次情報・確認 2026-09-03
- Oracle Database SQL 言語リファレンス: データ型一次情報・確認 2026-09-03