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.db

sqlite>が表示されたら、表示方法を設定します。

.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 booksbooksテーブルのデータを変更する
SET title = …titleに設定する新しい値を指定する
WHERE id = 2IDが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の後に、列と値の組み合わせをカンマで区切って書きます。

今回の変更内容は、次のとおりです。

列変更前変更後
titleGTK 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 booksbooksテーブルから行を削除する
WHERE id = 4IDが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が21件
著者名が佐藤花子3件
条件を指定しない全件

UPDATEもDELETEも、基本的には条件に一致する行すべてを対象にします。

1件を操作したい場合は、主キーのIDを使うと対象を明確にできます。

図3:WHEREの条件によって操作範囲が変わる

この図から分かること

WHEREの有無だけでなく、どのような条件を書いたかによっても、対象の行数が変わります。

変更や削除の前に、同じWHEREを使ったSELECTで対象を確認すると、意図と違う行を操作するミスに気づきやすくなります。

確認してから操作し、結果も確認する

今回の実習で使った流れを、これからの基本操作にしましょう。

  1. SELECTで対象の内容と件数を確認する
  2. UPDATEまたはDELETEに、確認したWHEREを付ける
  3. SQLを実行する
  4. 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言語からアクセスする準備を進めましょう。

Follow me!