9.13 一般述語のUPDATE/DELETE
LOOKUPテーブルは、主キーだけでなく一般条件式で複数行を更新・削除できます。 変更前に同じ条件で対象行数を確認してください。
このページの実習は、次の1つのテーブルで進め、最後に削除します。
CREATE LOOKUP TABLE ch9_predicate (
equip_id VARCHAR(32) PRIMARY KEY,
site VARCHAR(16),
status VARCHAR(16),
score INTEGER
);
INSERT INTO ch9_predicate VALUES ('EQ-01', 'SEOUL', 'READY', 10);
INSERT INTO ch9_predicate VALUES ('EQ-02', 'SEOUL', 'READY', 20);
INSERT INTO ch9_predicate VALUES ('EQ-03', 'SEOUL', 'RETIRED', 30);
INSERT INTO ch9_predicate VALUES ('EQ-04', 'BUSAN', 'READY', 40);UPDATE
条件に一致するすべての行を更新します。
SET式は現在の行値を参照できますが、主キー列自体は変更できません。
LOOKUP UPDATEにはWHERE条件が必要です。
全行を更新する場合でも、サポートされる条件式を明示してください。
WHEREなしで全件削除できるDELETEとは区別してください。
-- 変更前に影響範囲を数えます。
SELECT COUNT(*) FROM ch9_predicate
WHERE site = 'SEOUL' AND status = 'READY';
UPDATE ch9_predicate
SET status = 'ACTIVE', score = score + 10
WHERE site = 'SEOUL' AND status = 'READY';
SELECT equip_id, site, status, score FROM ch9_predicate ORDER BY equip_id;COUNTは2で、EQ-01とEQ-02だけがACTIVEに変わり、scoreは20・30になります。
同じSEOULでもstatusが異なるEQ-03、同じREADYでもsiteが異なるEQ-04は変わりません。
DELETE
条件に一致するすべての行を削除します。
WHEREを省略すると、テーブルの全行が削除されます。
SELECT COUNT(*) FROM ch9_predicate WHERE status = 'RETIRED';
DELETE FROM ch9_predicate WHERE status = 'RETIRED';
SELECT equip_id, status FROM ch9_predicate ORDER BY equip_id;COUNTは1で、EQ-03が削除されて3行が残ります。
条件の設計指針
- 単一行の変更には主キー条件を使用します。
- 一括変更前に、同じ条件の
SELECT COUNT(*)で影響範囲を確認します。 - 頻繁にフィルタリングするJSON値は、一般列に分離してインデックスを適用する方法を検討します。
- 主キーを変更する場合は、既存行を削除して新しいキーで挿入します。
サポートされる演算子とJSON条件の正確な範囲は、SQLリファレンスで確認してください。
権限とパフォーマンス
UPDATEとDELETEには、それぞれ対象テーブルのUPDATE、DELETE権限が必要です。
アプリケーションが変更前後の値を直接検索する場合だけ、SELECTも付与します。
権限SQLの正本は権限管理です。
主キーの等価条件は単一行を直接検索し、一般条件式は条件を評価して変更対象を収集します。 繰り返す単一行の変更には、プリペアドステートメントとバインドを使用します。 大量変更は、同じ条件の行数と実行時間を検証環境で測定してください。
DROP TABLE ch9_predicate;最終更新日