テーブルを作って書き込む
読了目安 約3分
CREATE TABLE の読み方と、INSERT、UPDATE、DELETE によるデータの書き込みを学びます。
この章の目次
CREATE TABLE の読み方
掲示板の投稿を入れる posts テーブルを、1 行ずつ読みながら作ります。 mysql クライアントで次を実行してください。
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 です。
INSERT INTO posts (user_id, body) VALUES (1, 'はじめまして!');「user_id と body の 2 列を指定して 1 行入れる」という意味です。 指定しなかった id と created_at は、AUTO_INCREMENT と DEFAULT が埋めます。
SELECT * FROM posts;+----+---------+-----------------------+---------------------+
| id | user_id | body | created_at |
+----+---------+-----------------------+---------------------+
| 1 | 1 | はじめまして! | 2026-07-17 12:00:00 |
+----+---------+-----------------------+---------------------+created_at には実行した瞬間の時刻が入るので、手元では別の値になります。
VALUES の後ろを並べると、複数行を一度に入れられます。
INSERT INTO posts (user_id, body) VALUES
(2, '今日は暑いですね'),
(1, 'ラーメン食べたい');UPDATE で書き換える
既存の行の書き換えは UPDATE です。
UPDATE posts SET body = '今日は涼しいですね' WHERE id = 2;SET が変更内容、WHERE が対象行の条件です。
WHERE の書き方は SELECT と同じで、条件に合うすべての行が書き換わります。
SELECT id, body FROM posts;+----+-----------------------+
| id | body |
+----+-----------------------+
| 1 | はじめまして! |
| 2 | 今日は涼しいですね |
| 3 | ラーメン食べたい |
+----+-----------------------+DELETE で消す
行の削除は DELETE で、これも WHERE で対象を指定します。
DELETE FROM posts WHERE id = 3;id が 3 の行だけが消えます。
WHERE のない UPDATE と DELETE
UPDATE と DELETE で WHERE を書き忘れると、対象は全行になります。
UPDATE posts SET body = 'こんにちは';Query OK, 2 rows affected (0.01 sec)これは文法エラーではなく、正しいクエリとして警告もなく成功します。
DELETE FROM posts; も同じで、全行が黙って消えます。
そして UPDATE や DELETE に「元に戻す」ボタンはありません。
だから書き込み系のクエリは、同じ WHERE の SELECT で対象を確認してから打ちます。 上の UPDATE は試してかまいません(posts は次章で作り直します)。 複数の書き込みをまとめて取り消せる仕組み(トランザクション)は /sql/08-transaction/ で扱います。