コンテンツにスキップ

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行が残ります。

条件の設計指針

  1. 単一行の変更には主キー条件を使用します。
  2. 一括変更前に、同じ条件のSELECT COUNT(*)で影響範囲を確認します。
  3. 頻繁にフィルタリングするJSON値は、一般列に分離してインデックスを適用する方法を検討します。
  4. 主キーを変更する場合は、既存行を削除して新しいキーで挿入します。

サポートされる演算子とJSON条件の正確な範囲は、SQLリファレンスで確認してください。

権限とパフォーマンス

UPDATEとDELETEには、それぞれ対象テーブルのUPDATEDELETE権限が必要です。 アプリケーションが変更前後の値を直接検索する場合だけ、SELECTも付与します。 権限SQLの正本は権限管理です。

主キーの等価条件は単一行を直接検索し、一般条件式は条件を評価して変更対象を収集します。 繰り返す単一行の変更には、プリペアドステートメントとバインドを使用します。 大量変更は、同じ条件の行数と実行時間を検証環境で測定してください。

DROP TABLE ch9_predicate;
最終更新日