【MySQL】SQLのデータ定義(DDL)の書き方まとめ(データベースやテーブルの作成、削除、更新、挿入)
SQLのDDLの書き方をまとめました。
データベースやテーブルの作成、削除、更新、挿入、主キーや外部キーの作成といった操作方法を紹介します。
データ操作に関しては、SQLのデータ操作(DML)の書き方まとめを参考にしてみてください。
カーソルがあたっているSQLを実行する
DBeaverなら、windowsもMacもctrl + enterでカーソルがあたっているSQLを実行できます。
SQLを書く場所の左側の矢印ボタンでも同じことが可能です。
複数行のSQLを実行する
DBeaverなら、windowsなら、alt+ X、Macならoption + Xで選択した複数行のSQLを実行可能です。
データベースを作成する
create database test_db;
セミコロンがないと、文が終わらず下のSQL文と結合されます。
文末には必ずセミコロンが必要です。
データベースを削除する
drop database test_db;
テーブルの作成方法
/*
create table ベータベース名.テーブル名 (
カラム名 データ型 default デフォルト値 制約 comment 'コメント',
...,
表制約
) ENGINE = [INNODB | MyISAM];
*/
create table test_db.test_table (
id int(8) unsigned default 0 comment 'ID',
val varchar(20) default 'こんにちは' comment '値'
);
上のENGINEはデータベースの種類ですが、INNODBしかほぼ使わないので記述はしなくても大丈夫です。
省略するとINNODBになります。
カラム名は、属性のことです。
commentが属性に対してのコメントです。
default デフォルト値は、カラム名に値が挿入されなかったときのデフォルトの値です。
一番最後の表制約は外部キーの設定などに使います。
SQLの実行
最後の行にカーソルをあわせて実行します。
上の場合なら、);の部分にカーソルをあわせてctrl+enterで実行します。
SQLエラー : No database selected
上のエラーが出たときは、どのデータベースかを指定していないためのエラーです。
SQLエラー : you have an error in your SQL syntax;
構文エラーです。
varcharなどの文字数を指定しているか、つづりに間違いがないか、文末にセミコロンがついているか、
最後の行にコンマをつけていないかなどチェックしてみましょう。
データ型
以下のようなデータ型が選択できます。
- INT: 整数値
- FLOAT: 浮動小数点
- ※正の値に限定する場合は unsigned を使用。
- DATETIME: 日時
- TIMESTAMP: 日時
- CHAR: 固定長文字列
- VARCHAR: 可変長文字列
- BLOB: バイナリデータ(画像や音声、動画など)
INTやFLOATのあとにunsignedをつけると正の値に制限できます。
またINTやVARCHARのように文字数が指定できるものは、varchar(20)のようにして指定します。
テーブルの削除
-- drop table データベース名.テーブル名;
drop table test_db.test_table;
データベースのときとほぼ同じでdropで削除できます。
テーブル定義の表示方法
3つの方法があります。
コメントなしのdesc, describe
-- テーブル定義表示
-- desc データベース名.テーブル名;
desc test_db.test_table;
describe test_db.test_table;
descもしくはdescribeでテーブルの内容を確認できます。
ただし、descではコメントは確認できません。
コメントありのshow full columns
-- show full columns from データベース名.テーブル名;
show full columns from test_db.test_table;
show full columns fromではコメントを含めて属性情報を表示できます。
fullをつけない場合は上のdescと同じです。
-- show create table データベース名.テーブル名;
show create table test_db.test_table;
show create tableでは、現時点でのクエリを確認することができます。
なれてくるとshow create tableの方が見やすくなるケースがあります。
アクティブのデータベースを切り替える use
useを使うと、アクティブのデータベースを設定することができます。
-- use データベース名;
use test_db;
上を実行すると、データベース名を省略したものは、useで定義されたデータベースがアクティブになります。
そのため、データベース名を省略できます。
アクティブなデータベース名を表示する
select detabase();
制約について
以下のような制約があります。
- UNIQUE: 一意制約
- NOT NULL: NOT NULL制約
- CHECK: チェック制約
- PRIMARY KEY: 主キー制約
- FOREIGN KEY: 外部キー制約
制約をテーブルや表に設けることで、正しい状態を保つことができます。
たとえば、UNIQUEを指定すれば、必ず一意の値に制限することができます。
NOT NULLなら、必ず値を保持させることができます。
PRIMARY KEYなら主キーであることを担保できます。
CHECK制約は、MySQLのバージョン8.1以上で使える制約です。
値はなるべく限定的にしてあげることで意図した動きになる上に、ストレージの容量も減らすことができます。
CHECKはPHPなどプログラムでもできるので、PHP側でやったほうがいいでしょう。
表制約
表全体にかける制約のことを表制約といいます。
表制約は、カラムの定義が終わったあとに記述します。
複合主キーや外部キーの指定などを表制約で行います。
列制約
列に対して書ける制約を列制約といいます。
列にNOT NULLなどを指定して値を正常に保ちます。
use test_db;
create table test_table(
id int not null default 0 comment 'ID',
-- id int default 0 not null comment 'ID'でもいい
var varchar(20) unique comment '値'
);
show full columns from test_table;
show full columnsで制約についても確認できます。
主キーの作成
create table test_table(
key1 int primary key
);
show full columns from test_table;
KeyにPRIなどの文字があれば設定できています。
Primary keyは、NOT NULLでUNIQUEなもので、その2つの制約があるものと認識すればOKです。
複合主キーの作成方法
create table test_table(
key1 int,
key2 int,
primary key (key1, key2)
);
show full columns from test_table;
複合主キーを作成するときは、列を定義したあと、表制約の部分で定義します。
上の場合なら、primary keyとしてkey1とkey2が指定されています。
show full columnsでは、KEYにPRIが両方入っていることが確認できます。
この複合主キーの場合は、key1とkey2にNOT NULL制約がついているような状態と考えられます。
auto_increment 自動IDの付与
主キーの値にこだわりがないときは、auto incrementで自動IDを付与することができます。
auto_incrementは、3つの注意点があります。
auto_incrementはインデックスされている必要がある
create table test_table(
key1 int auto_increment primary key
-- key1 int auto_increment unique
-- index (key1)
);
show full columns from test_table;
auto_incrementを使用するときは、indexを付与する必要があります。
indexとは、検索するための仕組みです。
primary keyとするか、uniqueとするか、indexで指定するかでindexを付与することができます。
Extraにauto_incrementがついていればOKです。
Extraに関してはdescでも確認できます。
auto_incrementの初期化
-- auto_incrementの初期化
alter table test_db.mst_shops auto_increment = 1;
1など開始たい数値を代入することで初期化できます。
indexの確認方法
show index from test_table;
indexは、show indexで確認することができます。
primary keyでindexを付与したなら、key_nameの属性でprimaryと確認することができます。
auto_incrementは一つのテーブルにつき一つの属性のみ
create table test_table(
key1 int auto_increment primary key
key2 int auto_increment unique
);
show full columns from test_table;
上のように2つ以上の列に対してauto_incrementはできません。
デフォルト値は設定できない
create table test_table(
key1 int auto_increment default 0 primary key
);
show full columns from test_table;
自動で採番されるため、上のようにデフォルト値は設定できません。
エラーになります。
テーブル定義の変更
create tableで作成したテーブルを変更したいとき、alter tableを使います。
既存テーブルに追加したいとき
use test_db;
alter table test_table
add column key2 varchar(30) not null,
add column key3 int(8) not null;
add columnで追加できます。
複数追加したい場合はaddをカンマでつなげて記述します。
特定の場所に追加したいとき after
alter table test_table
add column key10 int(4) after key1;
afterを使うことで、特定のcolumnのあとに追加することができます。
上の場合ならkey1の後にkey10が追加されます。
最初に追加したいとき first
alter table test_table
add column key12 int(4) first;
上の場合、firstによって、key12が最初のcolumnとして追加されます。
現在あるカラムの情報を変更したいとき modify
alter table test_table
modify column key12 varchar(20);
上のように既存のカラムを変更したいときは、modifyを使います。
制約なども付与できます。
カラムを削除する drop
alter table test_table
drop column key12;
dropで既存のカラムを削除することができます。
primary keyを削除する
alter table test_table
drop primary key;
上のようにすると、primary keyを削除できます。
incorrect table definition; there can be only one auto column and it must be defined as a key
上のエラーが出た場合、auto_incrementを先に削除する必要があります。
alter table test_table
modify column key1 int(10) not null;
その場合、上のようにauto_increamentがついていたkeyをmodifyで変更します。
その後、primary keyを削除します。
alter table test_table
drop primary key;
外部キーを設定する
外部キーは他のテーブルと結合するときに使うキーのことです。
外部キーを設定するときの注意点
以下の注意点があります。
- 型情報は合わせる
- インデックスの自動付与
同じ情報なので型情報は合わせる必要があります。
外部キーを作成すると、自動的にインデックスが付与されます。
インデックスとは、検索や並び替えを高速で処理するために必要なデータベースオブジェクトです。
ただし、すでに有効なキーが存在する場合には作成されません。例えば、複合主キーの一番最初はインデックスが作成されません。
外部キーのアクション
外部キーには、レコードが変更・削除されたときにアクションを指定することができます。
外部キーのアクションは以下の通りです。
- ON DELETE: レコードが削除された際のアクション
- ON UPDATE: レコードが更新された際のアクション
上のアクションのときの動作は主に以下の選択肢があります。
- CASCADE
- RESTRICT
CASCADE(カスケード)は、親テーブルの行を削除または更新し、子テーブル内の一致する行を自動的に削除または更新します。
RESTRICTは、親テーブルに対する削除または更新操作を拒否します。
ON DELETE または ON UPDATE 句を省略した場合、RESTRICTになります。
外部キー作成の構文
alter table 子テーブル名
add constraint 制約名(※削除する際に使用)
foreign key (対象のキー名)
references 親テーブル名(テーブルキー名)
on update cascade
on delete restrict; -- 省略可
親テーブルは、外部キーをはられる方です。
alter table mst_shops
add constraint fk_pref_id
foreign key (pref_id)
references mst_prefs(id)
on update cascade
on delete restrict;
上のように、まずは外部キーを貼りたいテーブル(子テーブル)を変更します。
制約名はfkなんとかなどわかりやすい名前にします。
addが終わったら表制約でforeign keyの対象キーを指定します。
参照先として、referencesを使って親テーブルを指定します。
アクションの指定があれば指定します。restrictの場合はデフォルトなので書かなくても大丈夫です。
外部キーの確認方法
データベースのER図をクリックして、テーブルをつなぐ線が出ているので、
その線をクリックすると外部キーを確認することができます。
外部キー制約ありのテーブルを削除するときの注意点
外部キー制約ありのテーブルを削除するとき、子テーブルから削除する必要があります。
そうしないとエラーになり、テーブルを削除できません。