20170515_about_mysql_foreign_key
2433 ワード
mysqlの初心者は外部キーの制約に対していつも多かれ少なかれいくつかの疑問を生んで、私は私のテストのいくつかの結果を記録して分かち合って、もしどこか間違っていたら、みんなの訂正を得ることを望んでいます
外部キーコンストレイントで追加されたテストは、次の2つのテーブルで行います.
名前が指定されていない外部キーを追加
文から外部キー制約を直接追加
外部キーの追加に成功しました.追加したばかりの外部キーを削除するにはどうすればいいですか?勉強したばかりの頃、外キーの名前がp_だと思っていました.ptype、次の文で追加した外部キーを削除できると思ったら、エラーが発生します.
これはなぜですか.外部キーを追加するときにこの外部キーに名前を設定していないので、mysqlは自分でデフォルトの名前をあげてくれます.
mysqlがこの外部キーに与えたデフォルト名は、次の操作で表示されます.
mysqlによって設定されたデフォルトの外部キー名は'product_であることがわかります.ibfk_1';
外部キー名がわかった以上、外部キーを削除することができます.
名前付き外部キーコンストレイントを追加
名前が付けられていない外部キー制約を文で追加したばかりで、名前が付けられた外部キー制約を追加します.
上の文は、この外部キー制約に名前を付け、「fk_p 2 c'は、外部キーを削除するにはテンプレート文で外部キー名をそのまま使用すればよい
同じカラムに複数の外部キーコンストレイントを追加できます
外部キーコンストレイントを追加するいくつかの注意点
1.テーブルに重複する外部キー名は使用できません
2.既存のプライマリ・キーにデータが存在する外部キーを関連付ける場合は、外部キー列の値がプライマリ・キー列の値を超えてはいけません.
外部キーコンストレイントで追加されたテストは、次の2つのテーブルで行います.
CREATE TABLE `category` (
`c_cno` INT(11) NOT NULL AUTO_INCREMENT,
`c_cname` VARCHAR(20) DEFAULT NULL,
PRIMARY KEY (`c_cno`)
) ;
CREATE TABLE `product` (
`p_pno` INT(11) NOT NULL AUTO_INCREMENT,
`p_pname` VARCHAR(20) DEFAULT NULL,
`p_ptype` INT(11) NOT NULL ,
PRIMARY KEY (`p_pno`)
) ;
名前が指定されていない外部キーを追加
文から外部キー制約を直接追加
ALTER TABLE product ADD FOREIGN KEY (p_ptype) REFERENCES category(c_cno);
外部キーの追加に成功しました.追加したばかりの外部キーを削除するにはどうすればいいですか?勉強したばかりの頃、外キーの名前がp_だと思っていました.ptype、次の文で追加した外部キーを削除できると思ったら、エラーが発生します.
ALTER TABLE product DROP FOREIGN KEY p_ptype;
これはなぜですか.外部キーを追加するときにこの外部キーに名前を設定していないので、mysqlは自分でデフォルトの名前をあげてくれます.
mysqlがこの外部キーに与えたデフォルト名は、次の操作で表示されます.
SHOW CREATE TABLE product;
product CREATE TABLE `product` (
`p_pno` INT(11) NOT NULL AUTO_INCREMENT,
`p_pname` VARCHAR(20) DEFAULT NULL,
`p_ptype` INT(11) NOT NULL,
PRIMARY KEY (`p_pno`),
KEY `p_ptype` (`p_ptype`),
CONSTRAINT `product_ibfk_1` FOREIGN KEY (`p_ptype`) REFERENCES `category` (`c_cno`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
mysqlによって設定されたデフォルトの外部キー名は'product_であることがわかります.ibfk_1';
CONSTRAINT `product_ibfk_1` FOREIGN KEY (`p_ptype`) REFERENCES `category` (`c_cno`)
外部キー名がわかった以上、外部キーを削除することができます.
ALTER TABLE product DROP FOREIGN KEY p_ptype;
名前付き外部キーコンストレイントを追加
名前が付けられていない外部キー制約を文で追加したばかりで、名前が付けられた外部キー制約を追加します.
ALTER TABLE product ADD CONSTRAINT fk_p2c FOREIGN KEY (p_ptype) REFERENCES category(c_cno);
上の文は、この外部キー制約に名前を付け、「fk_p 2 c'は、外部キーを削除するにはテンプレート文で外部キー名をそのまま使用すればよい
ALTER TABLE product DROP FOREIGN KEY fk_p2c;
同じカラムに複数の外部キーコンストレイントを追加できます
ALTER TABLE product ADD CONSTRAINT fk_p2c1 FOREIGN KEY (p_ptype) REFERENCES category(c_cno);
ALTER TABLE product ADD CONSTRAINT fk_p2c2 FOREIGN KEY (p_ptype) REFERENCES category(c_cno);
ALTER TABLE product ADD CONSTRAINT fk_p2c3 FOREIGN KEY (p_ptype) REFERENCES category(c_cno);
外部キーコンストレイントを追加するいくつかの注意点
1.テーブルに重複する外部キー名は使用できません
2.既存のプライマリ・キーにデータが存在する外部キーを関連付ける場合は、外部キー列の値がプライマリ・キー列の値を超えてはいけません.