定義域制約とデータ型(domain constraint / data type)
その列に入れてよい値の範囲を決めておく制約。型、長さ、値の一覧、空にできるかを宣言で縛る。
もう少し詳しい説明
制約の種類
データベースでは、正しくない値が入らないように宣言で縛ります。 試験では次の4つが並びます。
| 制約 | 縛るもの | 例 |
|---|---|---|
| 定義域制約 | その列に入れてよい値の範囲 | 区分は1か2だけ |
| 一意性制約 | 重複を許さない | 社員番号は重複しない |
| 参照制約 | 別の表に存在する値だけを許す | 顧客コードは顧客表にあるものだけ |
| 検査制約 | 条件式を満たす値だけを許す | 数量は1以上 |
定義域制約と検査制約は、重なる部分があります。 値の範囲を条件式で書くと、検査制約の形になります。
定義域制約で決めること
| 決めること | 書き方の例 |
|---|---|
| データ型 | CHAR、VARCHAR、INTEGER、DATE、DECIMAL |
| 長さ・桁数 | CHAR(8)、DECIMAL(8,2) |
| 空にできるか | NOT NULL |
| 入れてよい値の一覧 | CHECK (区分 IN (1, 2)) |
| 範囲 | CHECK (数量 >= 1) |
| 入れなかったときの値 | DEFAULT 0 |
データ型の選び分け
| 型 | 入るもの | 気を付けるところ |
|---|---|---|
| CHAR(n) | 固定長の文字列 | 足りない分は空白で埋まる |
| VARCHAR(n) | 可変長の文字列 | 入れた分だけの長さになる |
| INTEGER | 整数 | 小数は入らない |
| DECIMAL(m,n) | 桁数を決めた数 | 金額に向く。誤差が出ない |
| 浮動小数点数 | 小数 | 誤差が出る。金額には向かない |
| DATE / TIMESTAMP | 日付/日時 | 文字列で持つと、比較や並べ替えで困る |
コードを数値型で持つと、先頭の0が消えます。 「0001」という受講者コードを整数型にすると「1」になります。コードは文字列型で持つのが基本です。
日付を文字列で持つと、計算ができません。 日付の差を出す、月末を求める、といった処理が書けなくなります。
NULLを許すかどうか
| 許す | 許さない(NOT NULL) | |
|---|---|---|
| 空のまま登録できるか | できる | できない |
| 集計での扱い | 数に入らない | — |
| 比較 | = NULL では判定できない(IS NULL を使う) | — |
NULLは「値が無い」という状態で、0や空文字とは別です。
| 書き方 | 意味 |
|---|---|
| NULL | 値が入っていない |
| 0 | 数の0が入っている |
| 空文字(”) | 長さ0の文字列が入っている |
空欄が出る設計そのものを見直すほうが先です。 一部の種類にしか当てはまらない列は、サブタイプに移すと空欄がなくなります。
区分属性に付ける
スーパータイプとサブタイプに分けた表では、区分の列に入れてよい値を決めます。
区分 CHAR(1) NOT NULL
CHECK (区分 IN ('1', '2'))
この宣言が無いと、想定していない値が入ります。 「3」が入った行は、どちらのサブタイプにも対応しない状態になります。
プログラム側で確かめるのとの違い
| 確かめる場所 | 効き目 |
|---|---|
| プログラム | その処理を通ったときだけ効く |
| データベースの宣言 | どの経路から入れても効く |
宣言で縛ると、別の処理や手作業での登録にも効きます。 データを入れる経路が複数あるとき、ここが分かれ目になります。
一方で、
| 宣言で縛る難しさ | 中身 |
|---|---|
| 変えるときに手間がかかる | 既に入っているデータが条件に合わないと、宣言を足せない |
| 画面に出す知らせが作りにくい | 利用者に分かる言葉にするには、プログラム側でも確かめる必要がある |
両方で確かめる形が普通です。 宣言は最後の守り、プログラムは利用者への知らせ、という役割分担になります。
試験ではこう出る
科目A(旧・午前)では、制約の名前と中身の対応が問われます。値の範囲が定義域制約、別の表に存在する値だけが参照制約です。
NULLの扱いも出ます。集計で数に入らない、= NULL では判定できない、という部分です。
午後や応用情報(データベース)では、CREATE TABLE の空欄に書く形で出ます。CHECK句の中身や、NOT NULLを書くかどうかです。
関連する用語
- 主キー
- 1行を1つに決める制約。重複と空値を許さない
- 外部キー
- 別の表に存在する値だけを許す制約
- スーパータイプとサブタイプ
- 区分属性に入れてよい値を、この制約で決める
- 正規化
- 表の形を整える整理。制約は値の側を整える
ミニクイズ
定義域制約の例として、最も適切なものはどれか。
正解は 4番:区分の列には1または2だけを入れられるようにする
定義域制約は、その列に入れてよい値の範囲を決める制約です。区分の列を1と2だけに限るのはこれにあたります。他の表に存在する値だけを許すのは参照制約、同じ値が重複しないようにするのは一意性制約です。両方そろって確定させるのはトランザクションの性質で、列の値の範囲とは別の仕組みです。
この分野をまとめて解く → データベースのミニテスト(全35問)
最終更新:2026-11-09