🔩 ねじき教室 Go と Web の教室

テーブルを作って書き込む

読了目安 約3分

CREATE TABLE の読み方と、INSERT、UPDATE、DELETE によるデータの書き込みを学びます。

この章の目次

CREATE TABLE の読み方

掲示板の投稿を入れる posts テーブルを、1 行ずつ読みながら作ります。 mysql クライアントで次を実行してください。

SQL
CREATE TABLE posts (
  id INT AUTO_INCREMENT PRIMARY KEY,
  user_id INT NOT NULL,
  body TEXT NOT NULL,
  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);

括弧の中の各行は「列名、型、制約」の並びです。 型は、この Part で使うものだけで足ります。

  • INT:整数。
  • VARCHAR(n):最大 n 文字の文字列。名前やメールアドレスのような短い文字列に使う。
  • TEXT:長さの上限を先に決めない文字列。投稿本文のような長くなりうるものに使う。
  • DATETIME:日時。

型の後ろに付いているのが制約です。

  • NULL:値が入っていないことを表す、RDB の特別な状態。
  • NOT NULL:この列に NULL を許さない、つまり値を必ず入れさせる制約。
  • DEFAULT:値を指定しなかったときに入る初期値の指定。CURRENT_TIMESTAMP は「その時点の時刻」を意味する。

user_id は「どのユーザーの投稿か」を users の id の値で持つ列で、この参照の仕組みは次章で扱います。

主キーと AUTO_INCREMENT

主キー(PRIMARY KEY)は、行を一意に指すための列です。 同じ内容の投稿がありえるので、内容で行を指すのは当てになりません。 DB は主キーの重複をエラーとして拒否するので、「id が 3 の行」は常に 1 行に定まります。

AUTO_INCREMENT を付けると、行を追加するたびに DB が 1、2、3 と自動で番号を振ります。

INSERT で行を足す

行の追加は INSERT です。

SQL
INSERT INTO posts (user_id, body) VALUES (1, 'はじめまして!');

「user_id と body の 2 列を指定して 1 行入れる」という意味です。 指定しなかった id と created_at は、AUTO_INCREMENT と DEFAULT が埋めます。

SQL
SELECT * FROM posts;
テキスト
+----+---------+-----------------------+---------------------+
| id | user_id | body                  | created_at          |
+----+---------+-----------------------+---------------------+
|  1 |       1 | はじめまして!        | 2026-07-17 12:00:00 |
+----+---------+-----------------------+---------------------+

created_at には実行した瞬間の時刻が入るので、手元では別の値になります。

VALUES の後ろを並べると、複数行を一度に入れられます。

SQL
INSERT INTO posts (user_id, body) VALUES
  (2, '今日は暑いですね'),
  (1, 'ラーメン食べたい');

UPDATE で書き換える

既存の行の書き換えは UPDATE です。

SQL
UPDATE posts SET body = '今日は涼しいですね' WHERE id = 2;

SET が変更内容、WHERE が対象行の条件です。 WHERE の書き方は SELECT と同じで、条件に合うすべての行が書き換わります。

SQL
SELECT id, body FROM posts;
テキスト
+----+-----------------------+
| id | body                  |
+----+-----------------------+
|  1 | はじめまして!        |
|  2 | 今日は涼しいですね    |
|  3 | ラーメン食べたい      |
+----+-----------------------+

DELETE で消す

行の削除は DELETE で、これも WHERE で対象を指定します。

SQL
DELETE FROM posts WHERE id = 3;

id が 3 の行だけが消えます。

WHERE のない UPDATE と DELETE

UPDATE と DELETE で WHERE を書き忘れると、対象は全行になります。

SQL
UPDATE posts SET body = 'こんにちは';
テキスト
Query OK, 2 rows affected (0.01 sec)

これは文法エラーではなく、正しいクエリとして警告もなく成功します。 DELETE FROM posts; も同じで、全行が黙って消えます。 そして UPDATE や DELETE に「元に戻す」ボタンはありません。

だから書き込み系のクエリは、同じ WHERE の SELECT で対象を確認してから打ちます。 上の UPDATE は試してかまいません(posts は次章で作り直します)。 複数の書き込みをまとめて取り消せる仕組み(トランザクション)は /sql/08-transaction/ で扱います。