制約(Constraints)とは

Oracle Master Silver

Oracleデータベースにおける制約(Constraints)は、表に対して適用されるルールで、データの整合性や一貫性を保証するために使用されます。制約は、データベース内で予期しないエラーや不正なデータの登録を防ぐための重要な機能です。

この記事では、制約の種類や使用例、適用方法、設計上の注意点について詳しく解説します。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


主な制約の種類

Oracleデータベースでは、以下の主要な制約が使用されます。各制約の特徴を理解し、適切に活用することがデータベース設計の鍵となります。

1. NOT NULL制約

  • 列にNULL値を許可しないようにする制約です。
  • 主キー(PRIMARY KEY)制約の一部として必須です。

例:

CREATE TABLE employees (
    employee_id NUMBER PRIMARY KEY,
    first_name VARCHAR2(50) NOT NULL,
    last_name VARCHAR2(50)
);

2. UNIQUE制約

  • 列の値が一意であることを保証します。
  • 一つの表に複数のUNIQUE制約を設定できます。

例:

CREATE TABLE users (
    user_id NUMBER PRIMARY KEY,
    email VARCHAR2(100) UNIQUE
);

3. PRIMARY KEY制約

  • 各行を一意に識別するための制約です。
  • NOT NULLとUNIQUE制約を組み合わせた制約です。

例:

CREATE TABLE departments (
    department_id NUMBER PRIMARY KEY,
    department_name VARCHAR2(100) NOT NULL
);

4. FOREIGN KEY制約(参照制約)

  • 他の表の主キーまたは一意キーを参照する制約です。
  • データの整合性を保証します。
  • カスケード操作(ON DELETE CASCADEON DELETE SET NULL)を設定可能です。

例:

CREATE TABLE orders (
    order_id NUMBER PRIMARY KEY,
    customer_id NUMBER,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE
);

5. CHECK制約

  • 列の値が特定の条件を満たすかどうかをチェックします。
  • 複数条件を組み合わせて記述可能です。

例:

CREATE TABLE employees (
    employee_id NUMBER PRIMARY KEY,
    salary NUMBER CHECK (salary > 0 AND salary <= 1000000)
);

6. DEFAULT制約

  • 列にデフォルト値を設定します。
  • NOT NULL制約と組み合わせることが一般的です。

例:

CREATE TABLE products (
    product_id NUMBER PRIMARY KEY,
    price NUMBER DEFAULT 0
);

制約の設計上の注意点

  1. 過剰な制約設定を避ける
    • 必要以上に制約を設定すると、パフォーマンスや運用効率が低下する可能性があります。
  2. 制約名の命名規則を統一する
    • PK_表名FK_表名_参照先など、命名規則を決めておくと管理が容易になります。
  3. CHECK制約で複雑な条件を避ける
    • 複雑な条件はパフォーマンスに影響を与える可能性があるため、可能であればアプリケーション側で検証を行います。
  4. FOREIGN KEYでの循環参照を避ける
    • テーブル間で循環参照が発生しないよう、設計時に注意が必要です。

制約の追加と削除

既存の表に制約を追加または削除する方法を以下に示します。

制約の追加

例:

ALTER TABLE employees
ADD CONSTRAINT chk_salary CHECK (salary > 0);

制約の削除

例:

ALTER TABLE employees
DROP CONSTRAINT chk_salary;

制約の確認

表に設定されている制約を確認するには、USER_CONSTRAINTSビューとUSER_CONS_COLUMNSビューを使用します。

制約情報の取得例:

SELECT constraint_name, constraint_type, table_name
FROM user_constraints
WHERE table_name = 'EMPLOYEES';

制約に関連する列の確認例:

SELECT constraint_name, column_name
FROM user_cons_columns
WHERE table_name = 'EMPLOYEES';

実践例:複数の制約を活用したテーブル設計

以下は、複数の制約を組み合わせた実践的な例です。

CREATE TABLE sales (
    sale_id NUMBER PRIMARY KEY,
    product_id NUMBER NOT NULL,
    customer_id NUMBER NOT NULL,
    sale_date DATE DEFAULT SYSDATE,
    amount NUMBER CHECK (amount > 0),
    FOREIGN KEY (product_id) REFERENCES products(product_id) ON DELETE CASCADE,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

この設計では、

  • sale_idは主キーとして設定。
  • product_idおよびcustomer_idには外部キー制約を設定。
  • amountにはCHECK制約を設定し、不正な値を防止。
  • sale_dateにはデフォルト値を設定。

まとめ

制約は、データの整合性や一貫性を保証するための重要な仕組みです。適切に活用することで、データベースの信頼性を向上させることができます。一方で、過剰な制約設定はパフォーマンス低下につながる可能性があるため、設計時にはバランスを考慮することが重要です。

今後もOracleデータベースに関する知識を深める記事を提供していきますので、ぜひお楽しみに!

[参考]
Oracle Databaseデータベース管理者ガイド 19c

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました