かっちゃんのプログラミング奮闘記

このブログは、僕がプログラミング学習をしていく上で、知識のインプットを図るためのアウトプット場所として活用している場所です。

【SQL】テーブル作成と制約に関して

今回の記事はテーブル作成とその際の制約に関して学んだことをアウトプットしていきます。

DBのDCLに関して

DCLとは、データの制御を行ってくれるもので、主に誰に、どの様なデータ操作やテーブル操作を許すかといった権限を設定するためのSQL命令の総称のことを言う。

GRANT文とREVOKE文

・権限を付与するSQL命令が「GRANT文」

GRANT 権限名 TO ユーザ名

・権限を剥奪するSQL命令が「REVOKE文」

REVOKE 権限名 FROM ユーザ名

テーブルの作成

テーブルは「CREATE TABLE」で作成できる。

CREATE TABLE テーブル名(
  列名11の型名
  列名22の型名
    ・        ・
    ・        ・
);

デフォルト値(初期値)

テーブル作成時に、列に初期値としてDEFAULT(デフォルト値)を設定しておくことができる。

デフォルト値を設定しておくことで、NULLなど格納されたくないデータが格納されない様に防ぐことができるし、初期から入れて起きたい値を設定しておくことができる。

CREATE TABLE テーブル名(
  列名11の型名 DEFAULT デフォルト値
);

テーブルの削除

テーブルを削除したい場合は「DROP」で削除できる。

 DROP TABLE テーブル名

ALTER TABLE文(テーブル定義の変更)

既存の作成済みのテーブルの中身を変更したい場合は、ALTERを使用することで更新して変更することができる。

・列の追加
 ALTER TABLE テーブル名 ADD 列名 型 制約

・列の削除
 ALTER TABLE テーブル名  DROP 列名 型 制約

制約

情報を追加する時などに起こりうる、人為的なミスなどによる予期せぬミスに備えて、テーブル作成時に制約を設けることが良くある。

制約を設けてあえて制限をかけることで、予期せぬトラブルを未然に防ぐことができる。

代表的な制約

・NOT NULL制約
・UNIQUE制約
・CHECK制約
・主キー制約
・外部キー制約

NOT NULL制約

NOT NULL制約は指定した列内にNULLが格納されることを防ぎたい時に使用する。

UNIQUE制約(ユニーク制約)

ユニーク制約を設定することで、列内に同じ内容の情報が重複して登録されない様に制限をかけてくれる。

なので、メールアドレスなど同じ名前のデータ情報が保存されたくない時に使用する。

f:id:kazuki13070311:20210905160304p:plain
ID=3も食費に変更しようとしてもUNIQUE制約のおかげで同じ名前にはできない

ちなみにRailsだと

Railsだとmigrationファイルの制限をかけたいカラムの行に「unique: true」を記述すればユニーク制約を掛けられる。

class AddEmailToUsers < ActiveRecord::Migration
 def change
   add_column :users, :email, :string
   add_index :users, :email, unique: true
 end
end

また、アプリケーションのmodelファイル側でユニーク制約をかけたい場合は「uniqueness: true」を記述する。

class User < ApplicationRecord
 validates :name, uniqueness: true
end

note.com

主キー制約

主キー制約はNOT NULL制約とUNIQUE制約を同時に使用したい時に使用する。

主キー制約を使用することで、この2つの役割をになってくれる。

ちなみにRailsでは主キーはIDカラムとして自動生成される。
これによりIDカラムはNOT NULLにもなるし、UNIQUE制約で重複することもなくなる。

ちなみに主キーとは?

前にもチラッと書いたが、主キーとはテーブルの情報を一意に(ユニークに)識別するためのものである。

この表を参照するときのレコード(行)のこのIDだ!というこのIDの部分のこと。

外部キー制約

外部キーが参照している先に、必ず行(レコード)が存在していて、リレーションシップが成立する様にしておくことのことを言う。

内部結合など結合で複数の2つのテーブル間同士がリレーションシップで繋がっている時に、外部キーで参照している先の行(レコード)がなくなってしまうと、エラーになって大問題になるので、これを防ぐために外部キー制約を設ける。

Railsモデルのdependent: :destroyに近い役割かな?

外部キーとは?

外部キーは「他のテーブルのデータを参照することが出来る様にするための制約をつけたカラム」のことを言う。

外部キーを生成した際は、参照先の主テーブルの名前+idの名前が外部キーのカラム名前になる。

なので、仮にUserテーブルに紐づく子テーブルのPostテーブルがUserテーブルを参照していた場合、Postテーブルには、「user_id」という名前の外部キーが生成される。

user_idの中には、対応するuserのidが格納される。