【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図をクリックして、テーブルをつなぐ線が出ているので、
その線をクリックすると外部キーを確認することができます。

外部キー制約ありのテーブルを削除するときの注意点

外部キー制約ありのテーブルを削除するとき、子テーブルから削除する必要があります。
そうしないとエラーになり、テーブルを削除できません。