質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

1回答

1214閲覧

SQLiteで正規化されたDBにデータを追加したい

nuh

総合スコア15

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2023/05/21 09:50

実現したいこと

sqlite3.exe

1CREATE TABLE "user" ( 2 "user_id" INTEGER, 3 "user_name" TEXT, 4 "prefecture_id" INTEGER, 5 PRIMARY KEY("user_id" AUTOINCREMENT) 6); 7 8CREATE TABLE "prefecture" ( 9 "prefecture_id" INTEGER, 10 "prefecture" TEXT UNIQUE, 11 PRIMARY KEY("prefecture_id" AUTOINCREMENT) 12);

このような2つのテーブルがあるとします。

この時
user_name='山田'
prefecture='東京都'
というデータを挿入したいです。
(追加するデータの形式はPowerShellのハッシュテーブルを想定しています)

試したこと

sqlite3.exe

1INSERT OR IGNORE INTO prefecture (prefecture) VALUES('東京都'); 2 3INSERT INTO user (user_name,prefecture_id) 4VALUES ('山田',(SELECT prefecture_id 5FROM prefecture 6WHERE prefecture = '東京都'));

このようにしてまずprefectureテーブルに都道府県のデータがなければ追加して
その後prefecture_idを取得してそれをuserテーブルに書き込む、
これで目的の操作はできるのですが
これだとテーブルが分けられているデータの数だけ1つめのINSERTを実行しないといけませんし
2つめのINSERTもその分だけ複雑化してしまいます。

第一正規形のテーブルであれば
INSERT INTO user (user_name,prefecture)
VALUES ('山田','東京都');
これで簡単にデータが追加できますが
これぐらい簡単な方法で正規化されたDBにデータを追加する方法はありませんか?

補足情報(FW/ツールのバージョンなど)

Windows 10 64bit
sqlite3.exe version 3.41.1
PowerShell 7.3.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

すこしでも短くするなら

INSERT OR IGNORE INTO prefecture (prefecture) VALUES('東京都'); INSERT INTO user (user_name, prefecture_id) SELECT '山田', prefecture_id FROM prefecture WHERE prefecture = '東京都';

これ以上は無理。(47都道府県名がユニークであるという事実を利用)

INSERT INTO user (user_name,prefecture)
VALUES ('山田','東京都');
これぐらい簡単な方法で正規化されたDBにデータを追加する方法はありませんか?

ありません。
別テーブルにある外部キー項目(userにおけるprefacture_idの参照先であるprefactureテーブル内のprefacture)について、キーではない値('東京都')を指定して、主テーブル(user)の項目と "同時に" "直接" 挿入しようとすること自体イレギュラーな行為です。
イレギュラーな方法をやるのですから、質問文に書いてあるくらいの構文になるのは仕方がないとあきらめてください。(質問文に書いてある構文自体(一番簡単ではないけれども)特に複雑"すぎる"構文とも思えませんが)

投稿2023/05/21 10:25

編集2023/05/21 10:38
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問