6
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

schema.sqlの書き方の例

Posted at

#schema.sqlの書き方を書いている記事がない
初心者です。実務に入るときに「実務では細かく定義する必要があるからschema.sqlは手動できちんと書きましょう」と言われましたが、書き方を探しても本当に何もないんですよね。ということで、サンプルコード(ここでは、飲食店での食材管理を想定したテーブル)を掲載します!
以下にサンプルコードがあり、その後に軽い解説も入れています。

schema.sql
create table if not exists foodstuff (
    id              bigint       unsigned not null auto_increment comment 'ID',
    name            varchar(30)           not null unique key comment '食品名',
    delivery        date                  not null comment '納入日',
    expiration_date date                  not null comment '消費期限',
    stock_amount    int                   not null comment '在庫量',
    status          tinyint(1)            not null default 0 comment 'ステータス',
    create_time     datetime              not null default current_timestamp comment '作成日時',
    update_time     datetime              not null default current_timestamp on update current_timestamp comment '更新日時',
    primary key (id)
)
character set utf8mb4 engine innodb;

#解説

create table if not exists foodstuff

ここではテーブル名を定義しており、この部分の基本的な形は"create table foodstuff"です。しかし、基本的な形のままだと2回目以降の読み込みの際に再度同じテーブルが作られて同じ名前のテーブルが複数存在することになり、エラーの原因となります。その状況を回避するため、"if not exists"を挿入することで同じ名前のテーブルがすでに存在する場合は再度テーブルを作成しないようにしています。

id bigint unsigned not null auto_increment comment 'ID',

スペースをたくさん入れているのは見やすくするためで、実際の動作に関しては、必要な部分でスペースが1個あれば大丈夫です。
この1行(カンマまで)で1つのカラムを定義しています。左から順にカラム名、データ型(、オプション)です。
"unsigned"というのは符号なしという意味です。IDは1から始まって増えていくだけなので、マイナスは不要なのでこれを付けています。
"not null"は文字通りnullを許容しないというオプションです。
"auto_increment"を指定するとデータを入れたときにそのカラムにすでに入っているデータの中で最大のものよりも1大きい値が自動で入ります。
"comment 'ID'"というのはコメントで、ここに書いたことはデータベースには反映されません。日本語でカラムの説明をしたいときなどに付けます。

status tinyint(1) not null default 0 comment 'ステータス',

この行にあるように、"default 0"などとデフォルトの値を決めることもできます。

create_time datetime not null default current_timestamp comment '作成日時',
update_time datetime not null default current_timestamp on update current_timestamp comment '更新日時',

作成日時と更新日時はこのようになります。"current_timestamp"で現在時刻(データを作成した時刻)を指定できます。この2行に関しては他の書き方があまりないので、どのようなテーブルでも同じようになるのではないでしょうか。

primary key (id)

ここは文字通り、idカラムをprimary keyとして指定するという意味です。

character set utf8mb4 engine innodb;

テーブルの括弧の後でテーブル全体のオプションを指定しています。ここは必要に応じて指定してください。また、テーブルの定義はセミコロンまでなので、セミコロンを付けることをお忘れなく。

#まとめ
最後までお読みいただき、ありがとうございました。間違い等があればコメント欄へお願いします!

6
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?