C言語+MySQL入門|今回作成する在庫管理アプリ

C言語+MySQL入門|今回作成する在庫管理アプリ
これから作るのは、商品の情報と在庫の増減を、C言語とMySQLで管理する在庫管理アプリです。
商品を登録して一覧表示するところから始め、入庫や出庫によって在庫数を更新し、その履歴を確認できるようにしていきます。
最初は、文字のメニューから操作するコンソール版を作ります。その後、GTK 4を使って、入力欄やボタンで操作できるGUI版へ進みます。
この記事では、完成するアプリの機能、管理するデータ、実際の操作の流れを紹介します。画面やデータは完成イメージを説明するための例です。まだプログラムの実装は行わず、これから何を作るのかを具体的に思い描いていきましょう。
商品と在庫の動きを管理するアプリを作ろう
在庫管理では、商品名や単価だけでなく、現在いくつあるのか、いつ増えたり減ったりしたのかを把握する必要があります。
たとえば、文房具を扱う小さな倉庫を考えてみましょう。
- 新しく扱う商品を登録する
- 届いた商品を入庫する
- 必要な数量を出庫する
- 現在の在庫数を確認する
- 過去の入出庫を振り返る
今回のアプリでは、このような基本的な操作をできるようにします。
完成を目指す機能
| 機能 | できること | 操作の例 |
|---|---|---|
| 商品登録 | 新しい商品を追加する | ノートを登録する |
| 商品一覧 | 登録済みの商品を確認する | 商品名、単価、在庫数を表示する |
| 商品変更 | 商品の基本情報を変更する | ノートの単価を変更する |
| 商品削除 | 条件を確認して商品を削除する | 誤って登録した商品を削除する |
| 入庫 | 在庫を増やして履歴を残す | ノートを30個入庫する |
| 出庫 | 在庫を減らして履歴を残す | ノートを6個出庫する |
| 在庫履歴表示 | 入出庫の記録を確認する | ノートがいつ何個動いたかを表示する |
商品IDによる検索も、変更や削除、入出庫の対象を確認するために使います。
商品そのものの情報を管理する機能と、商品の数量の動きを管理する機能を組み合わせることが、今回のアプリの中心です。
アプリの操作とMySQLの保存データをつなぐ
利用者は、アプリのメニューやボタンを使って操作します。
その裏側では、Cプログラムが入力を確認し、Connector/Cを通してMySQL Serverへ処理を要求します。MySQL Serverは、商品情報や在庫履歴をデータベースへ保存します。
| 担当 | 在庫管理アプリで行うこと |
|---|---|
| Cプログラム | 入力確認、処理の呼び出し、結果の表示 |
| MariaDB Connector/C | MySQLへの接続やSQLの実行を支える |
| MySQL Server | 商品情報と在庫履歴を管理する |
| GTK 4 | GUI版のウィンドウ、入力欄、ボタンなどを作る |
たとえば、入庫の操作をした場合、アプリの画面にある数字だけを増やすのではありません。MySQLへ変更を保存し、その結果を画面へ反映します。
保存・確定した情報は、アプリを終了して再び起動したあとも、データベースから取得して利用できます。
図1:在庫管理アプリでできること

この図から分かること
今回のアプリでは、商品の基本情報と、入庫・出庫による数量の変化を管理します。
アプリは操作を受け付ける窓口となり、商品情報や履歴はMySQLに保存します。
利用者の操作、Cプログラムの処理、データベースへの保存がつながることで、在庫管理の機能が実現します。
商品情報として何を保存するのか
商品を管理するには、どのような項目を保存するかを決めます。
今回の教材では、次の情報を基本にします。
| 項目 | 意味 | 例 |
|---|---|---|
| 商品ID | 商品を識別する番号 | 101 |
| 商品名 | 商品の名前 | ノート |
| 単価 | 商品1個当たりの金額 | 180円 |
| 在庫数 | 現在管理している数量 | 24個 |
| 登録日時 | 商品を登録した日時 | 2026-10-01 09:00:00 |
以降の金額は、円単位の例で説明します。日時も操作の流れを示すための例です。
商品IDで操作対象を特定する
商品名だけで商品を選ぶと、似た名前や同じ名前の商品がある場合に、どれを操作しているのか分かりにくくなります。
そこで、商品IDを使って対象を特定します。
| 商品ID | 商品名 | 単価 |
|---|---|---|
| 101 | ノート | 180円 |
| 102 | ボールペン | 120円 |
| 103 | クリアファイル | 90円 |
単価の変更、削除、入庫、出庫などでは、対象の商品IDを確認して処理します。
GUI版では、一覧で選んだ行に対応する商品IDをアプリが保持することで、対象を指定できるようにします。
商品の登録・一覧・変更・削除を作る
データベースを使うアプリの基本操作は、CRUDと呼ばれることがあります。
| 操作 | 英語 | 今回のアプリでの機能 |
|---|---|---|
| 作成 | Create | 商品登録 |
| 読み取り | Read | 商品一覧や商品検索 |
| 更新 | Update | 商品名や単価の変更 |
| 削除 | Delete | 商品削除 |
まずは、この4つの操作を動かせるようにして、在庫管理アプリの土台を作ります。
商品を登録する
商品登録では、商品名と単価を入力します。
完成イメージでは、在庫数を0から始め、実際に商品が入ってきた数量を入庫機能で記録します。こうすると、最初の在庫がどのように増えたかも履歴に残せます。
| 入力・処理する項目 | 例 |
|---|---|
| 商品名 | ノート |
| 単価 | 180円 |
| 登録直後の在庫数 | 0個 |
| 登録結果 | 商品IDが割り当てられ、商品として保存される |
商品IDの割り当て方法など、具体的なテーブルの定義は第3章で扱います。
商品を一覧表示する
商品一覧では、登録済みの商品を表形式で表示します。
次の表は、各商品を登録し、入出庫を行ったあとの表示例です。
| 商品ID | 商品名 | 単価 | 在庫数 |
|---|---|---|---|
| 101 | ノート | 180円 | 24個 |
| 102 | ボールペン | 120円 | 50個 |
| 103 | クリアファイル | 90円 | 35個 |
利用者は、この一覧から商品IDや現在の在庫数を確認できます。
商品がまだ登録されていない場合は、空の画面だけを出すのではなく、商品が登録されていないことが分かるメッセージを表示します。
商品名や単価を変更する
商品変更では、商品名の修正や単価の変更を行います。
たとえば、ノートの単価を180円から200円へ変更する場合です。
| 項目 | 変更前 | 変更後 |
|---|---|---|
| 商品ID | 101 | 101 |
| 商品名 | ノート | ノート |
| 単価 | 180円 | 200円 |
| 在庫数 | 24個 | 24個 |
単価を変更しても、在庫数は変えません。
今回のアプリでは、商品の基本情報の変更と、入出庫による数量の変更を別の操作として扱います。
商品の削除では履歴との関係も確認する
商品削除では、削除対象を確認してから処理します。
ここで考える必要があるのが、過去の入出庫履歴です。
商品だけを削除すると、その商品に関する履歴をどう表示するのか、という問題が生じます。また、在庫が残っている商品を削除してよいかも決める必要があります。
- 削除しようとしている商品は正しいか
- 在庫が残っていないか
- 過去の入出庫履歴があるか
- 削除後も履歴との関係が保たれるか
具体的な削除条件と、履歴がある商品の扱いは、第3章のテーブル設計と第10章のアプリ設計で決めます。
削除ボタンを押せば何でも消せるようにするのではなく、データの関係を確認したうえで処理する機能として作っていきます。
入庫と出庫で在庫数を管理する
在庫管理アプリらしい機能が、入庫と出庫です。
入庫は在庫を増やす操作、出庫は在庫を減らす操作です。どちらも、対象の商品と数量を指定します。
入庫では在庫を増やす
登録直後のノートの在庫数が0個だったとします。
ノートが30個届いたら、商品IDと入庫数量を指定して入庫処理を行います。
| 項目 | 内容 |
|---|---|
| 対象商品 | 商品ID 101のノート |
| 入庫前の在庫数 | 0個 |
| 入庫数量 | 30個 |
| 入庫後の在庫数 | 30個 |
このとき、在庫数を増やすだけでなく、30個を入庫したという履歴も保存します。
出庫では在庫を減らす
続いて、ノートを6個出庫します。
| 項目 | 内容 |
|---|---|
| 対象商品 | 商品ID 101のノート |
| 出庫前の在庫数 | 30個 |
| 出庫数量 | 6個 |
| 出庫後の在庫数 | 24個 |
出庫でも、在庫数の変更と履歴の保存を行います。
数量には正の整数を入力し、入庫・出庫のどちらを行うかで増減を区別する形を基本にします。
在庫より多い数量は出庫しない
現在の在庫が24個なのに、25個の出庫を要求された場合は、処理を成立させないようにします。
| 項目 | 内容 |
|---|---|
| 現在の在庫数 | 24個 |
| 要求された出庫数量 | 25個 |
| 操作結果 | 在庫不足として出庫を受け付けない |
| 操作後の在庫数 | 24個 |
この場合、在庫数を変更せず、成功した出庫としての履歴も追加しません。
利用者には、在庫が不足していることを伝え、数量を確認できるようにします。
図2:入庫・出庫と在庫数の変化

この図から分かること
商品の登録後、入庫によって在庫が増え、出庫によって在庫が減ります。
この例では、0個から30個入庫し、6個出庫した結果、在庫数が24個になります。
在庫より多い数量の出庫は受け付けず、数量を変えないようにします。また、成功した入出庫については、在庫の変化を履歴へ残します。
在庫履歴で数量が変わった理由を確認する
現在の在庫数だけでは、どうしてその数量になったのかが分かりません。
そこで、入庫や出庫を行うたびに、その記録を在庫履歴として保存します。
| 項目 | 記録する内容 |
|---|---|
| 履歴ID | 履歴を識別する番号 |
| 商品ID | どの商品を操作したか |
| 種別 | 入庫か出庫か |
| 数量 | 何個動かしたか |
| 記録日時 | いつ処理したか |
ノートの履歴を表示する例
先ほどの操作を履歴として表示すると、次のようになります。
| 履歴ID | 商品ID | 商品名 | 種別 | 数量 | 記録日時 |
|---|---|---|---|---|---|
| 1 | 101 | ノート | 入庫 | 30個 | 2026-10-01 09:10:00 |
| 2 | 101 | ノート | 出庫 | 6個 | 2026-10-01 10:30:00 |
この例では、初期在庫が0個なので、30個の入庫と6個の出庫から、現在の在庫24個につながっていることが分かります。
画面の商品名は、商品IDを使って商品テーブルと対応付けて表示します。履歴テーブルに商品情報をすべて重複して保存する必要はありません。
在庫履歴と商品情報の変更は区別する
今回の在庫履歴は、入庫・出庫による数量の動きを記録するものです。
商品名や単価の変更履歴まで、自動的に記録されるわけではありません。
| 操作 | 今回の在庫履歴への記録 |
|---|---|
| ノートを30個入庫する | 入庫として記録する |
| ノートを6個出庫する | 出庫として記録する |
| 単価を180円から200円へ変更する | 入出庫履歴には記録しない |
| 在庫不足で出庫できなかった | 成功した出庫としては記録しない |
何を履歴として残しているかを明確にしておくと、画面に表示された記録を正しく読み取れます。
在庫の更新と履歴の保存を一緒に扱う
入庫や出庫では、少なくとも次の二つの変更が必要です。
- 商品テーブルの在庫数を更新する
- 在庫履歴テーブルに記録を追加する
どちらか片方だけ成功すると、データに食い違いが生じます。
| 起きたこと | 困ること |
|---|---|
| 在庫数だけ減った | 何の操作で減ったのかを履歴から確認できない |
| 履歴だけ追加された | 出庫した記録があるのに在庫数が変わっていない |
| 両方が正しく反映された | 現在の在庫と入出庫の記録が対応する |
この二つをひとまとまりとして扱うために、トランザクションを使う設計にします。
すべて成功したら確定し、途中で失敗したら変更を取り消す流れを作ります。複数のアプリが同じ商品を同時に操作する場面も考え、更新する時点で在庫不足を防ぐ処理を組み込みます。
詳しい実装は第8章で学び、完成版の入出庫機能へ組み込んでいきます。
最初は文字のメニューから操作する
コンソール版では、番号を選んで操作するメニューを用意します。
次は、完成イメージを表す表示例です。実行済みのプログラムの出力ではなく、これから作る画面の案として見てください。
コンソール版のメニュー表示例
在庫管理アプリ
1. 商品を登録する
2. 商品を一覧表示する
3. 商品情報を変更する
4. 商品を削除する
5. 入庫する
6. 出庫する
7. 在庫履歴を表示する
0. 終了する
操作を選んでください:たとえば、入庫を選ぶと、商品IDと数量を入力する流れにします。
入庫操作の表示例
商品IDを入力してください:101
商品名:ノート
現在の在庫数:0個
入庫数量を入力してください:30
入庫しました。
入庫後の在庫数:30個操作後は結果を表示し、メニューへ戻るようにします。
商品IDが存在しない場合や、数量の入力が適切でない場合は、その理由を表示して、データを変更せずに入力のやり直しやメニューへの復帰ができるようにします。
GUI版では入力欄やボタンから操作する
GUI版では、コンソール版で作った機能を、GTK 4の画面から呼び出します。
画面には、次のような部品を配置する予定です。
| 画面の部品 | 用途 |
|---|---|
| 商品名の入力欄 | 商品名を入力・編集する |
| 単価の入力欄 | 単価を入力・編集する |
| 商品一覧 | 商品を確認し、操作対象を選ぶ |
| 数量の入力欄 | 入庫・出庫する数量を指定する |
| 操作ボタン | 登録、変更、削除、入庫、出庫などを実行する |
| 履歴表示部分 | 選択した商品の入出庫記録を確認する |
| メッセージ欄 | 成功や入力エラーなどを伝える |
商品が選択されていないときは、変更や削除などを実行できないようにすることも考えます。
ボタンを押したときに処理が動くだけでなく、今どの商品を操作しているか、操作が成功したかが分かる画面を目指します。
図3:コンソール版とGUI版で共通のDB処理を使う

この図から分かること
コンソール版とGUI版では、入力や表示の方法が異なります。
一方、商品登録や入出庫などのDB処理は、共通のC言語の関数として利用する方針です。画面ごとにデータベース操作をすべて書き直すのではなく、作った処理を再利用していきます。
図の共通のDB処理は、別のサーバーを表しているのではなく、各アプリに組み込む関数を表しています。
正しい操作と間違った操作の両方を確認する
アプリを完成させるときは、正しい入力で動くことに加えて、入力ミスや処理できない状況も確認します。
| 確認する場面 | 期待する動き |
|---|---|
| 正しい商品名と単価を入力する | 商品を登録する |
| 商品名が空になっている | 入力を見直すように伝える |
| 単価に負の値を入力する | 登録・変更を受け付けない |
| 数量に文字や0、負の値を入力する | 入出庫を受け付けない |
| 存在しない商品IDを指定する | 対象の商品がないことを伝える |
| 在庫より多い数量を出庫する | 在庫を変えず、不足を伝える |
| 履歴に関係する商品を削除しようとする | 決めた削除ルールに従って処理する |
| MySQL Serverへ接続できない | DB操作ができないことを伝える |
入力できる数値や文字列の上限も、データベースとCプログラムで扱える範囲に合わせて決めます。
また、失敗した操作に対して成功メッセージを表示しないことも重要です。処理結果を確認してから画面へ伝えるようにします。
一連の操作がつながることを完成の目標にする
機能を一つずつ作ったあと、商品登録から履歴確認までを通して操作します。
| 順序 | 操作 | 確認すること |
|---|---|---|
| 1 | ノートを単価180円で登録する | 商品が保存され、在庫数が0になる |
| 2 | ノートを30個入庫する | 在庫数が30になり、入庫履歴が残る |
| 3 | ノートを6個出庫する | 在庫数が24になり、出庫履歴が残る |
| 4 | 25個の出庫を試す | 在庫不足として処理され、在庫数が24のままになる |
| 5 | 単価を200円へ変更する | 単価だけが変わり、在庫数は変わらない |
| 6 | 在庫履歴を表示する | 30個の入庫と6個の出庫を確認できる |
| 7 | アプリを終了して再起動する | 保存済みの商品と履歴を再び取得できる |
個々の機能が動くだけでなく、操作を続けても商品情報・在庫数・履歴が対応していることを確かめます。
こうした確認を重ねながら、まずコンソール版を完成させ、そのDB処理をGUI版へつなげていきます。
次の記事では、なぜコンソール版から始めるのか、どの処理を共通化してGUI版へ進むのかを詳しく見ていきましょう。










