20170515_about_mysql_foreign_key

2433 ワード

mysqlの初心者は外部キーの制約に対していつも多かれ少なかれいくつかの疑問を生んで、私は私のテストのいくつかの結果を記録して分かち合って、もしどこか間違っていたら、みんなの訂正を得ることを望んでいます
外部キーコンストレイントで追加されたテストは、次の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.既存のプライマリ・キーにデータが存在する外部キーを関連付ける場合は、外部キー列の値がプライマリ・キー列の値を超えてはいけません.