すべてのプロダクト
Search
ドキュメントセンター

PolarDB:CHECK 制約

最終更新日:Apr 22, 2025

CHECK 制約は、列の値の範囲を制限するために使用されます。テーブルに CHECK 制約を定義すると、挿入または更新操作を実行することで、制約を満たす値のみをテーブルに追加できます。

サポートされているバージョン

データベースエンジンのバージョンは MySQL 8.0 で、インスタンスのバージョンは polardb-2.5.0_5.4.20-20241224_xcluster8.4.20-20241213 以降です。

説明

構文

[CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]
説明

CHECK 制約の構文は、MySQL が提供する CHECK 制約の構文と同じです。詳細については、「CHECK Constraints」をご参照ください。

パラメータ:

パラメータ

説明

CONSTRAINT [symbol]

制約の名前。名前を指定しない場合、システムは TableName_chk_(1,2,3...) 形式で自動的に名前を生成します。

CHECK (expr)

制約条件。expr は、テーブルの各行に対して TRUEFALSE、または UNKNOWN と評価される必要があるブール式です。UNKNOWN は、列値が NULL であることを示します。行の場合、式が FALSE または UNKNOWN と評価されると、失敗し、制約違反が発生します。

[NOT] ENFORCED

CHECK 制約を無効にするかどうかを指定します。デフォルトでは、CHECK 制約は有効になっています。

CHECK 制約を追加する

PolarDB-X では、CREATE TABLE 文と ALTER TABLE 文を使用して、テーブルまたは列に CHECK 制約を追加できます。

重要
  • テーブルレベルの制約: これらの制約は、個々の列定義の外側で定義され、テーブル内の 1 つ以上の列に適用できます。

  • 列レベルの制約: これらの制約は、個々の列定義内で定義され、その特定の列の値にのみ適用されます。

  • CREATE TABLE 文に CHECK 制約を追加します。例:

    CREATE TABLE t1
    (
      CHECK (c1 <> c2), /* テーブル制約 */
      c1 INT CHECK (c1 > 10), /* 列制約 */
      c2 INT CONSTRAINT c2_positive CHECK (c2 > 0),
      c3 INT CHECK (c3 < 100),
      CONSTRAINT c1_nonzero CHECK (c1 <> 0),
      CHECK (c1 > c3)
    );
  • ALTER TABLE 文に CHECK 制約を追加します。例:

    -- 列制約
    ALTER TABLE t1 ADD COLUMN c4 INT CHECK (c4 > 0);
    
    -- テーブル制約
    ALTER TABLE t1 ADD CHECK (c4 < c3);
    ALTER TABLE t1 ADD CONSTRAINT `c4_maximize` CHECK (c4 < 20);
  • CHECK 制約を表示します。

    SHOW CREATE TABLE t1;

    結果例:

    CREATE TABLE `t1` (
    	`c1` int DEFAULT NULL,
    	`c2` int DEFAULT NULL,
    	`c3` int DEFAULT NULL,
    	`c4` int DEFAULT NULL,
    	CONSTRAINT `c1_nonzero` CHECK (`c1` <> 0),
    	CONSTRAINT `c2_positive` CHECK (`c2` > 0),
    	CONSTRAINT `c4_maximize` CHECK (`c4` < 20),
    	CONSTRAINT `t1_chk_1` CHECK (`c1` <> `c2`),
    	CONSTRAINT `t1_chk_2` CHECK (`c1` > 10),
    	CONSTRAINT `t1_chk_3` CHECK (`c3` < 100),
    	CONSTRAINT `t1_chk_4` CHECK (`c1` > `c3`),
    	CONSTRAINT `t1_chk_5` CHECK (`c4` > 0),
    	CONSTRAINT `t1_chk_6` CHECK (`c4` < `c3`)
    ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 DEFAULT COLLATE = utf8mb4_general_ci

CHECK 制約を有効または無効にする

  • CHECK 制約に NOT ENFORCED オプションを指定すると、制約は有効になりません。データが挿入または更新されるときに、システムは指定された制約に対してデータをチェックしません。例:

    ALTER TABLE t1 ADD CHECK c4_c1_not_equal (c4 <> c1) NOT ENFORCED;
  • NOT ENFORCED オプションを指定しない場合、または ENFORCED オプションを指定した場合、システムはすべての新しい挿入と更新を制約に対してチェックします。ただし、既存のデータは、更新されない限りチェックされません。

  • ALTER TABLE 文を使用して、CHECK 制約の有効化ステータスを調整できます。例:

ALTER TABLE t1 ALTER CONSTRAINT c1_nonzero NOT ENFORCED;

CHECK 制約を削除する

CHECK 制約を削除する場合は、その名前を指定する必要があります。例:

ALTER TABLE t1 DROP CONSTRAINT t1_chk_1;