💭

SQL-データ型と制約について

2023/06/16に公開

SQLのデータ型をまとめる

こんにちは!わいわわです。
テーブルを作成するときにカラムの名前とそのデータ型を指定しなければならないですよね。
スクールでアプリを作成するときに判別に苦労した覚えがあります。
このデータ型は非常に重要で、そのカラムに保存する値のフォーマットをそろえることができたり、
値をどのように扱うか決めておいたりすることができます。

今回はそんなデータ型をまとめてみました!

大きな分類

データ型にはいくつか種類があり、大きく分類すると
・数値を扱う型
・文字列を扱う型
・日付や時間を扱う型
といったものがあります。

数値を扱うデータ型

数値を扱うデータ型を設定したカラムにはその名の通り数値のみを保存することができます。
そのため、誤って数値以外の文字列などの値が保存されることがなくなります!
また、演算子を使うことで「○○以上」など検索出来たり、
SUM関数などで合計値を計算したりといったことも可能になります。

数値型の種類とカラムに格納できる桁数

数値を扱うデータ型をおおまかに分類すると

TINYINT -128~127
SMALLINT -32768~32767
MEDIUMINT -8388608~8388607
INT -2147483648~2147483647
BIGIMT -9223372036854775808~9223372036854775807

このようにMySQLでは「INT」が用意されており、型の種類によって格納できる数値の範囲に違いがあります。

また、少数を扱う型の例として下記などが用意されています。
DECIMAL 誤差のない正確な少数を格納
FLOAT 小数第7位程度まで格納
DOUBLE 小数第15位程度まで格納

それ以外でも「111」などの0と1のみで値を表すビット値を格納するための「BIT」という型もあります。
それぞれ格納できる値の範囲が違いますが、
より大きい桁数のデータ型を選ぶとその分だけ値を格納するときのサイズが大きくなるため、
格納される値の大きさに応じて適切なデータ型を選択することが大事です。

文字列を扱うデータ型

ユーザーが入力した名前や住所、コメントなどを保存したり、
大きめのサイズの文章を格納しておいたりするなどの用途が考えられます。
また「123」と格納した場合でも数値型ではなく文字として扱われます。

また、文字列を扱うデータ型の種類として
 
CHAR 0~255バイトを指定
VARCHAR 0~65,535バイトを指定
TINYTEXT 255バイト
TEXT 65,535バイト
MEDIUMTEXT 16,777,215バイト
LONGTEXT 4,294,967,295バイト
 
などがあるため、格納される値の大きさに応じてデータ型を選択する必要があります。

固定長と可変長

固定長...一定の長さでデータが揃えられる(CHAR)
可変長...データに合わせた長さで値を保存する(VARCHAR)
などの特徴もあります!

日付や時間を扱うデータ型

こちらはその名の通り、日付や時間の値を登録することができます。
数値型と同じく演算子を使うことができ、「○月○日以前」などの指定ができます。
また「ORDER BY」を使って日付順にレコードを並べ替えることも可能です。
それぞれの詳しい記事は以前まとめておりますのでこちらを!
https://zenn.dev/waiwawaiwai/articles/8015bf2553757b
https://zenn.dev/waiwawaiwai/articles/c4a6bda81a7722

日付や時間を扱うデータ型にも種類があります。
DATE 日付
DATETIME 日付と時間
TIME 時間
YEAR 年
こちらも保存したい値に合わせて適切なデータ型を選択するようにします。

BOOLEAN型

BOOLEAN型は2種類の値のみを扱うデータ型です。
このデータを設定したカラムに保存できる値は「真(true)」と「偽(false)」の2種類です。
この値をプログラムの世界では真偽地ブール値と呼んでいて、
ONかOFFかといった2つの状態を表現するときによく用います。

BOOLEAN型にカラムを保存したいとき、「真」の場合は「1」、
「偽」の場合は「0」を代入します。

制約や属性

テーブルのカラムに対して制約をつけて格納できるデータに制限をかけたり、
属性をつけて値をある規則で整えて格納することができます。
適切につけておくことで不正なデータが入ることを避け、
不整合が発生するのをあらかじめ防ぐことができます。
また、属性をつけて一定のルールでデータを揃えておくことで、
データを管理しやすくなるメリットもあります。

DEFAULT

DEFAULT制約を使うとカラムに初期値を設定することができます。
DEFAULT制約を設定したカラムに値を何もセットせずにレコードを追加した場合は
あらかじめ指定しておいた初期値が格納されるようになります。
また、もし明示的に値をセットした場合には初期値は使われず、セットした値が格納されます。

使い方としては「商品テーブルの在庫数カラムの初期値」を「0」にしておいたり、
商品の決済ステータスをあらかじめ未払いの状態にセットしておくといった用途に使います。

NULL

NULLはデータが格納されていない状態を表します。「ヌル」などと呼ばれます。
そもそも何も入っていないので0や空の文字列とも区別されます。
数字でも文字列でもありません。
「NULL」にすることでそのフィールドには何も格納していないということを明示的に表すことができます。
NULLはSELECT分に
WHERE age IS NULLなどのように条件を指定して検索が可能です。

また、逆は「NOT NULL」でNULLを格納できないようにすることもできます。
言い換えると必ず何らかの値を格納しておく必要のあるカラムに設定できます。

UNIQUE

他の行と同じ値を入れられないようにする制約がUNIQUEです。
もし重複した値を格納しようとした場合はエラーとなって登録ができません。

例として商品コードやユーザーIDのような必ず同じ値が存在しないカラムに設定しておくといった用途が考えられます。
ちなみに「NULL」は「UNIQUE」の対象にはなりません。
値が存在するレコードにのみ適用さるということになります。

AUTO_INCREMENT

この制約を使用するとカラムに自動的に連続した番号を格納することができます。
例えば最初にレコードを挿入した時に
カラムには自動的に「1」が格納されます。
さらに新たなレコードを挿入すると「2」が格納され、
レコードを挿入するたびに1,2,3,4...と連番が自動的に格納されていきます。

商品IDやユーザーIDのようなカラムに設定すると非常に便利です。

PRIMARY KEY

このPRIMARY KEYを使用するとレコードを一意に識別できるようになります。
PRIMARY KEYを設定したカラムの値さえわかれば、1つのレコードを特定することができるため、
各レコードを識別するためのカラムに設定しておくと便利です。

例として、ユーザー情報が保存されているテーブルに「佐藤」という名前のユーザーが
2人登録されていたとします。
2人は別人ですが、名前のカラムだけ見てもレコードを識別することができません。
そこでPRIMARY KEYを別に準備しておけば、2つのレコードの識別ができる、といったイメージです。
これはプライマリキー主キーと呼ばれます。

FOREIGN KEY、外部キー

カラムにFOREIGN KEYを設定するとそのカラムには指定した他のテーブルのカラムに存在する値しか格納できなくなります。
つまり、他のテーブルの値に依存したカラムを設けて、テーブル同士を関連付けておくことができます。

例として、例えば部署の情報が保存っされたテーブルを用意し、これを親テーブルとします。
それに関連づいた子テーブルとして「部署ID」を格納するカラムを設けたユーザーの情報を保存するテーブルを作成するとします。
この「部署ID」カラムは部署テーブルと紐づいているので、
部署テーブルに格納されていない部署のIDは登録できないようにしておく必要があり、
このようなカラムに対してFOREIGN KEY、外部キーを設定します。

所感

今回はSQLのデータ型と制約について学習しました。
PFでもしっかり実装したものが多く、今回は復習がメインでした。
ただ、「NULL」は「UNIQUE」の対象にはならないという点など、
知らない部分もありましたのでより知見を深めることができました!

Discussion