C言語DB入門|UPDATEとDELETEを使う

C言語DB入門|UPDATEとDELETEを使う
前の記事では、booksテーブルに10件の書籍情報を登録し、SELECTで一覧表示や条件検索を行いました。
今回は、登録済みの情報を変更するUPDATEと、不要になった情報を削除するDELETEを使います。
この記事では、次の操作を学びます。
- UPDATEで書籍のタイトルを変更する
- 複数の列をまとめて変更する
- DELETEで指定した書籍情報を削除する
- SELECTで操作の前後を確認する
- WHEREを省略した場合の影響を理解する
特に大切なのは、どの行を変更・削除するのかを、WHEREで指定することです。
まずSELECTで対象を確認してから操作し、実行後も結果を確認する流れで進めましょう。
UPDATEとDELETEの役割
UPDATEとDELETEは、保存済みのデータを操作するSQLです。
| SQL | 役割 | 書籍管理での例 |
|---|---|---|
| UPDATE | 行の中にある値を変更する | タイトルや著者名を修正する |
| DELETE | 行を削除する | 管理対象から外した書籍情報を取り除く |
UPDATEでは、指定した列の値を書き換えます。今回のような通常の更新では、書籍の件数は変わりません。
DELETEでは、対象となる行全体を取り除くため、その分だけ件数が減ります。
books.dbを開く
VS CodeでMSYS2 UCRT64の統合ターミナルを開き、次のコマンドを実行します。
cd /c/c-db/chap03続いて、データベースを開きます。
sqlite3 books.dbsqlite>が表示されたら、表示方法を設定します。
.headers on
.mode listこれで、前の記事と同じように、列名と区切り文字を使って結果を確認できます。
操作前の10件を確認する
最初に、現在のデータを表示しましょう。
SELECT id, title, author
FROM books
ORDER BY id;実行結果の例
id|title|author
1|はじめてのC言語|佐藤花子
2|SQLite入門|田中太郎
3|GTK 4入門|鈴木一郎
4|はじめてのC言語|山田次郎
5|C言語ポインタの基本|佐藤花子
6|SQLの基礎|田中太郎
7|データベース設計入門|高橋美咲
8|C言語で作るコンソールアプリ|伊藤健
9|GTK 4で作るGUIアプリ|鈴木一郎
10|書籍管理アプリを作ろう|佐藤花子この記事では、この10件が登録されている状態から進めます。
過去の実習で登録や削除を繰り返している場合は、IDが異なることがあります。その場合は、表示された内容を確認し、操作したい行のIDに合わせてください。
今回行う変更と削除
| 対象 | 行う操作 |
|---|---|
| IDが2の書籍 | タイトルを変更する |
| IDが3の書籍 | タイトルと著者名を変更する |
| IDが4の書籍 | 行を削除する |
図1:値を変更するUPDATEと行を削除するDELETE

この図から分かること
UPDATEは、行を残したまま、指定した列の値を変更します。
DELETEは、対象の行全体を削除します。タイトルだけを消す操作と、書籍情報を1件削除する操作は異なります。
UPDATEでタイトルを変更する
まず、IDが2の書籍のタイトルを、SQLite入門からSQLite入門 改訂版へ変更します。
変更前のデータを確認する
いきなりUPDATEを実行せず、同じ条件のSELECTで対象を確認しましょう。
SELECT id, title, author
FROM books
WHERE id = 2;実行結果の例
id|title|author
2|SQLite入門|田中太郎変更したい書籍が表示されていることを確認してください。
タイトルを変更するSQL
続いて、次のSQLを実行します。
UPDATE books
SET title = 'SQLite入門 改訂版'
WHERE id = 2;正常に実行できると、通常はメッセージを表示せず、sqlite>に戻ります。
| 記述 | 意味 |
|---|---|
| UPDATE books | booksテーブルのデータを変更する |
| SET title = … | titleに設定する新しい値を指定する |
| WHERE id = 2 | IDが2の行を対象にする |
SETでは、変更する列と新しい値を指定します。SETに書いていない列は、そのまま残ります。SQLite公式:UPDATE
今回変更するのはtitleだけなので、idとauthorは変わりません。
変更後のデータを確認する
もう一度、同じSELECTを実行します。
SELECT id, title, author
FROM books
WHERE id = 2;実行結果の例
id|title|author
2|SQLite入門 改訂版|田中太郎タイトルだけが変更されました。
UPDATEを実行した後にSELECTで確認すると、意図した変更になっているかを確かめられます。
SETとWHEREの役割を分けて考える
UPDATEでは、SETとWHEREを区別すると読みやすくなります。
| 指定 | 決めること |
|---|---|
| SET | 何の値に変更するか |
| WHERE | どの行を変更するか |
先ほどのSQLでは、SETで新しいタイトルを指定し、WHEREでIDが2の行を選んでいます。
また、同じ等号でも、使われている場所によって役割が異なります。
- SETの等号は、列に設定する値を示す
- WHEREの等号は、値が等しいという条件を示す
SQLを読むときは、変更内容と対象条件を、それぞれ確認してみましょう。
複数の列をまとめて変更する
UPDATEでは、1回のSQLで複数の列を変更できます。
次は、IDが3の書籍について、タイトルと著者名の表記を修正します。
変更前のデータを確認する
SELECT id, title, author
FROM books
WHERE id = 3;実行結果の例
id|title|author
3|GTK 4入門|鈴木一郎タイトルと著者名を変更するSQL
UPDATE books
SET title = 'GTK 4アプリ入門',
author = '鈴木一朗'
WHERE id = 3;複数の列を変更するときは、SETの後に、列と値の組み合わせをカンマで区切って書きます。
今回の変更内容は、次のとおりです。
| 列 | 変更前 | 変更後 |
|---|---|---|
| title | GTK 4入門 | GTK 4アプリ入門 |
| author | 鈴木一郎 | 鈴木一朗 |
最後のauthorの指定の後には、カンマを付けません。
変更結果を確認する
SELECT id, title, author
FROM books
WHERE id = 3;実行結果の例
id|title|author
3|GTK 4アプリ入門|鈴木一朗タイトルと著者名が変更され、IDは3のままです。
今回はIDで対象を指定しているため、同じ著者名だったIDが9の行には影響しません。
DELETEで書籍情報を削除する
次は、IDが4の書籍情報を削除します。
DELETEは、条件に合う行全体を取り除くSQLです。列名を指定して、一部の値だけを消す書き方ではありません。
削除する対象を確認する
まずはSELECTを実行します。
SELECT id, title, author
FROM books
WHERE id = 4;実行結果の例
id|title|author
4|はじめてのC言語|山田次郎削除するのは、山田次郎による、はじめてのC言語です。
同じタイトルを持つIDが1の書籍とは、別の行です。
指定した書籍情報を削除するSQL
対象を確認したら、次のSQLを実行します。
DELETE FROM books
WHERE id = 4;正常に実行できると、通常はメッセージを表示せず、sqlite>に戻ります。
| 記述 | 意味 |
|---|---|
| DELETE FROM books | booksテーブルから行を削除する |
| WHERE id = 4 | IDが4の行を対象にする |
この操作では、IDが4の行にあるid、title、authorの値が、行ごと取り除かれます。
削除されたことを確認する
もう一度、同じ条件でSELECTを実行します。
SELECT id, title, author
FROM books
WHERE id = 4;今回の表示設定では、通常は何も表示されず、sqlite>に戻ります。
これはエラーではありません。IDが4の行が存在しなくなったため、取得結果が0件になっています。
件数を確認する
SELECT COUNT(*) AS book_count
FROM books;実行結果の例
book_count
9最初の10件から1件を削除したため、9件になりました。
図2:IDで指定した1行だけを削除する

この図から分かること
WHEREでIDを指定すると、対象の行だけを削除できます。
削除後は件数が減りますが、残った行のIDは変わりません。IDが4の場所を埋めるために、番号を付け直す必要はありません。
変更・削除後の一覧を確認する
ここまでの結果を、一覧で確認しましょう。
SELECT id, title, author
FROM books
ORDER BY id;実行結果の例
id|title|author
1|はじめてのC言語|佐藤花子
2|SQLite入門 改訂版|田中太郎
3|GTK 4アプリ入門|鈴木一朗
5|C言語ポインタの基本|佐藤花子
6|SQLの基礎|田中太郎
7|データベース設計入門|高橋美咲
8|C言語で作るコンソールアプリ|伊藤健
9|GTK 4で作るGUIアプリ|鈴木一郎
10|書籍管理アプリを作ろう|佐藤花子次の点を確認してください。
- IDが2のタイトルが変更されている
- IDが3のタイトルと著者名が変更されている
- IDが4の行がなくなっている
- それ以外の行が残っている
最大のIDは10ですが、データの件数は9件です。件数を調べるときは、前の記事で学んだCOUNT(*)を使いましょう。
WHEREを書き忘れると、全行が対象になる
ここからは、WHEREを省略した場合の動作を確認します。
次に示す2つのSQLは説明用です。実習中のbooksテーブルでは実行しないでください。
WHEREを省略しても、SQLの文法エラーになるとは限りません。全行への操作として、正常に実行される点が重要です。
WHEREのないUPDATE
UPDATE books
SET author = '未設定';このSQLには、対象を絞るWHEREがありません。
そのため、booksテーブルのすべての行で、authorが未設定という文字列に変更されます。
ここまでの実習後に実行した場合は、残っている9件すべての著者名が書き換わります。
| 項目 | 実行した場合の結果 |
|---|---|
| 対象 | booksの全行 |
| 変更される列 | author |
| 新しい値 | 未設定 |
| 書籍の件数 | 9件のまま |
全行が対象でも、変更されるのはSETに指定した列です。この例では、idとtitleは変わりません。
WHEREのないDELETE
DELETE FROM books;このSQLを実行すると、booksテーブルのすべての行が削除されます。
| 項目 | 実行した場合の結果 |
|---|---|
| 対象 | booksの全行 |
| 残る書籍データ | 0件 |
| booksテーブルの構造 | 残る |
| books.db | 残る |
DELETEで全行を削除しても、テーブルそのものやデータベースファイルがなくなるわけではありません。
ただし、保存していた書籍情報は取り除かれます。
WHEREがあっても、対象が1件とは限らない
WHEREを書いてあれば、必ず1件だけが対象になるわけではありません。
たとえば、著者名が佐藤花子という条件では、今回のデータのうちIDが1、5、10の3件が一致します。
| 条件 | 今回のデータで対象になる行 |
|---|---|
| IDが2 | 1件 |
| 著者名が佐藤花子 | 3件 |
| 条件を指定しない | 全件 |
UPDATEもDELETEも、基本的には条件に一致する行すべてを対象にします。
1件を操作したい場合は、主キーのIDを使うと対象を明確にできます。
図3:WHEREの条件によって操作範囲が変わる

この図から分かること
WHEREの有無だけでなく、どのような条件を書いたかによっても、対象の行数が変わります。
変更や削除の前に、同じWHEREを使ったSELECTで対象を確認すると、意図と違う行を操作するミスに気づきやすくなります。
確認してから操作し、結果も確認する
今回の実習で使った流れを、これからの基本操作にしましょう。
- SELECTで対象の内容と件数を確認する
- UPDATEまたはDELETEに、確認したWHEREを付ける
- SQLを実行する
- SELECTで結果を確認する
特に、UPDATEではSETとWHEREの間違い、DELETEではWHEREの書き忘れに注意します。
終了しても操作は取り消されない
今回の手順では、明示的なトランザクションを開始していません。そのため、正常に完了した変更や削除は自動的に確定します。
確定済みの操作は、SQLiteを終了したり、後からROLLBACKを実行したりするだけでは取り消せません。
確認してから確定するためのトランザクションという仕組みもありますが、まずは今回の実習で、対象を確認する習慣を身につけましょう。
操作がうまくいかないときは
| 状況 | 確認すること |
|---|---|
| UPDATEしても内容が変わらない | WHEREに指定したIDが存在するか |
| DELETEしても件数が減らない | 対象の行がすでに削除されていないか |
| 複数行が変更・削除された | WHEREの条件に複数の行が一致していないか |
| syntax errorと表示される | SET、カンマ、引用符、セミコロンの位置 |
| NOT NULL constraint failedと表示される | titleやauthorにNULLを設定しようとしていないか |
| 想定と違うデータが表示される | .databasesで開いているファイルの場所を確認する |
条件に合う行が0件の場合、UPDATEやDELETEは通常、対象なしで終了します。
エラーが出なかったことと、目的の行を操作できたことは同じではありません。実行後のSELECTで確認することが大切です。
SQLによるCRUDがつながった
前の記事と今回の記事で、データを扱う4つの基本操作を体験できました。
| 操作 | 意味 | 使用するSQL |
|---|---|---|
| Create | データを登録する | INSERT |
| Read | データを取得する | SELECT |
| Update | データを変更する | UPDATE |
| Delete | データを削除する | DELETE |
この4つをまとめてCRUDと呼びます。
CRUDのCreateは、データを登録する操作を指します。テーブルの構造を作るCREATE TABLEとは、役割が異なります。
ここまで操作できたら、SQLiteを終了します。
.quit変更後の9件の書籍情報は、books.dbに保存されています。
次の記事では、C言語のプログラムからSQLiteを利用する仕組みを学びます。これまでコマンドラインから操作していたデータベースへ、今度はC言語からアクセスする準備を進めましょう。










