0
1

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 1 year has passed since last update.

MySQL外部キーの設定と設定するとできること

Posted at

Userテーブルのidを参照してPostテーブルのuser_idを外部キーに設定する場合

CREATE TABLE IF NOT EXISTS `db`.`User` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`deleted_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`))
CREATE TABLE IF NOT EXISTS `db`.`Post` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`deleted_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
,FOREIGN KEY fk_user_id(user_id) REFERENCES User(id)) //この一文

↑の最後の行が当該文。
FOREIGN KEY 外部キー名(参照元カラム名) REFERENCES 参照先テーブル名(参照先カラム名)

外部キー設定するとできること

https://www.dbonline.jp/mysql/table/index11.html#section3
値の整合性を担保するために、親テーブルの参照元のカラムの値を更新、削除するとエラーが発生する。
エラーの振る舞いも設定することができる

RESTRICT
親テーブルに対して削除または更新を行うとエラーとなります。設定を省略した場合は RESTRICT を設定したのと同じです。

CASCADE
親テーブルに対して削除または更新を行うと、子テーブルで同じ値を持つカラムのデータに対して削除または更新を行います。

SET NULL
親テーブルに対して削除または更新を行うと、子テーブルの同じ値を持つカラムの値が NULL になります。

NO ACTION
親テーブルに対して削除または更新を行うとエラーとなります。 RESTRICT を設定した場合と同じです。

SET DEFAULT
現在この設定を行うとテーブルの作成が行えません。
0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?