ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
基本構文
UPDATE は DML (Data Manipulation Language) の代表格で、テーブルの既存行を書き換えるためのコマンドです。
-- 1 カラム更新
UPDATE users
SET status = 'active'
WHERE id = 1;
-- 複数カラム同時更新
UPDATE users
SET status = 'active',
updated_at = NOW(),
login_count = login_count + 1
WHERE id = 1;
-- 計算式・関数も可
UPDATE products
SET price = price * 1.10, -- 10% 値上げ
updated_at = CURRENT_TIMESTAMP
WHERE category = 'food';
WHERE 忘れは全件更新の事故
UPDATE で最も致命的なミスは WHERE 句の付け忘れです。1 行のつもりがテーブル全行を書き換えます。
-- ❌ 全件 status='active' になる
UPDATE users SET status = 'active';
-- ✅ 必ず WHERE を付ける
UPDATE users SET status = 'active' WHERE id = 1;
-- ✅ さらに安全: 件数を SELECT で先に確認
SELECT COUNT(*) FROM users WHERE id = 1; -- 1 のはず
BEGIN;
UPDATE users SET status = 'active' WHERE id = 1;
-- 影響行数を確認してから
COMMIT; -- または ROLLBACK
MySQL Workbench には safe_updates モードがあり、WHERE 句が主キー / インデックスを含まない UPDATE をエラーで弾けます:
SET SQL_SAFE_UPDATES = 1;
UPDATE users SET status = 'active'; -- → Error Code 1175
JOIN を使った UPDATE
他のテーブルの値を参照して更新したい場合、DB ごとに構文が違います。
| DB | 構文 |
|---|---|
| MySQL / MariaDB | UPDATE a JOIN b ON ... SET a.col = b.col |
| PostgreSQL | UPDATE a SET col = b.col FROM b WHERE a.id = b.a_id |
| SQL Server | UPDATE a SET col = b.col FROM a JOIN b ON ... |
| Oracle | サブクエリ or MERGE 文 |
-- MySQL: 注文テーブルの total を、明細から再計算
UPDATE orders o
JOIN (
SELECT order_id, SUM(price * qty) AS total
FROM order_items
GROUP BY order_id
) t ON o.id = t.order_id
SET o.total = t.total;
-- PostgreSQL: 同じ内容
UPDATE orders o
SET total = t.total
FROM (
SELECT order_id, SUM(price * qty) AS total
FROM order_items
GROUP BY order_id
) t
WHERE o.id = t.order_id;
-- Oracle: MERGE を使うのが定番
MERGE INTO orders o
USING (
SELECT order_id, SUM(price * qty) AS total
FROM order_items
GROUP BY order_id
) t
ON (o.id = t.order_id)
WHEN MATCHED THEN UPDATE SET o.total = t.total;
RETURNING で更新後の行を取得
PostgreSQL / Oracle / SQL Server (OUTPUT) では、UPDATE と同時に更新後の値を取得できます。MySQL は非対応です。
-- PostgreSQL
UPDATE users
SET login_count = login_count + 1,
last_login = NOW()
WHERE id = 1
RETURNING id, login_count, last_login;
-- Oracle (PL/SQL)
UPDATE users
SET login_count = login_count + 1
WHERE id = 1
RETURNING login_count INTO :new_count;
-- SQL Server
UPDATE users
SET login_count = login_count + 1
OUTPUT INSERTED.id, INSERTED.login_count
WHERE id = 1;
LIMIT 付き UPDATE
大量行を分割して更新したいときに使います。必ず ORDER BY と併用すべきです。
-- MySQL: 1000 行ずつ status を更新
UPDATE logs
SET archived = 1
WHERE archived = 0
ORDER BY id
LIMIT 1000;
-- これをループで実行(負荷分散)
-- PostgreSQL は UPDATE LIMIT 非対応。CTE で代用
WITH target AS (
SELECT id FROM logs WHERE archived = 0 LIMIT 1000
)
UPDATE logs
SET archived = 1
WHERE id IN (SELECT id FROM target);
TRANSACTION で安全に
「失敗したら戻す」運用には必須。ドライランにも使えます。
BEGIN; -- または START TRANSACTION
-- 1. 対象を SELECT で確認
SELECT id, status FROM users WHERE status = 'pending';
-- 2. UPDATE 実行
UPDATE users SET status = 'active' WHERE status = 'pending';
-- 影響行数を確認
-- 3a. 想定通り → コミット
COMMIT;
-- 3b. おかしい → ロールバック
ROLLBACK;
Optimistic Locking (楽観的ロック)
複数ユーザーが同じ行を編集する Web アプリでは、version 列を使った楽観ロックが定番です。
-- テーブル設計
CREATE TABLE articles (
id BIGINT PRIMARY KEY,
title VARCHAR(255),
body TEXT,
version INT NOT NULL DEFAULT 0,
updated_at TIMESTAMP
);
-- 1. 取得時に version を保持
SELECT id, title, body, version FROM articles WHERE id = 100;
-- → version = 5
-- 2. 更新時に「version が 5 のまま」を条件に
UPDATE articles
SET title = '新しいタイトル',
body = '新しい本文',
version = version + 1,
updated_at = NOW()
WHERE id = 100
AND version = 5; -- ★ ここがポイント
-- 影響行数 0 件 = 他者に先を越された
-- → アプリ側で「他のユーザーが編集しました」を返す
Java JPA / Hibernate は @Version アノテーションで自動化:
@Entity
public class Article {
@Id Long id;
String title;
@Version Integer version; // ★ Hibernate が自動で WHERE version=? を付ける
}
// 他者更新済みなら OptimisticLockException が飛ぶ
TRIGGER による副作用
UPDATE 時に BEFORE/AFTER UPDATE トリガーが走り、別テーブルを更新したり履歴を残したりできます。
-- 例: ユーザー更新を audit_log に残す(MySQL)
CREATE TRIGGER trg_users_audit
AFTER UPDATE ON users
FOR EACH ROW
INSERT INTO audit_log (table_name, row_id, old_status, new_status, changed_at)
VALUES ('users', NEW.id, OLD.status, NEW.status, NOW());
-- UPDATE すると自動で audit_log に行が追加される
UPDATE users SET status = 'active' WHERE id = 1;
性能: インデックスと UPDATE
- WHERE 句のカラムにインデックスが無いと、対象 1 行でも全件スキャンになる
- 更新対象カラム自体にもインデックスがあるとインデックス更新のコストがかかる
- 大量行の UPDATE は LIMIT + ループで分割し、binlog / WAL の肥大を防ぐ
- 更新前後で行サイズが大きく増える場合 (TEXT 等) はページ分割が起きて遅い → 行末追記設計を検討
-- 実行計画で確認
EXPLAIN UPDATE users SET status = 'active' WHERE email = 'a@example.com';
-- type: ALL → インデックス無し(テーブル全スキャン)
-- type: ref / range → インデックス利用
-- email にインデックスを張る
CREATE INDEX idx_users_email ON users(email);
FAQ
Q: UPDATE で影響を受けた行数を知りたい
A: MySQL: SELECT ROW_COUNT()。PostgreSQL: GET DIAGNOSTICS rc = ROW_COUNT (PL/pgSQL)。ORM では UPDATE 戻り値が件数のことが多い。
Q: UPDATE が遅すぎる
A: WHERE 句に index があるか EXPLAIN で確認。大量行ならバッチ分割。トリガーや CHECK 制約も犯人候補。
Q: 同一行を同時に UPDATE すると?
A: 行ロックで直列化されます。長時間トランザクションはデッドロックの元 → トランザクションは短く。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?