0

興味と製品を表す 2 つのテーブルがあります。それらの間に many_many 関係を実装しています。テーブルを作成したとき、製品または関心のレコードが削除された場合に割り当てテーブルのレコードが削除されるように、テーブルの制約を作成するのを怠りました。

関心表

CREATE TABLE IF NOT EXISTS `interests` (
  `id` int(11) NOT NULL auto_increment,
  `interest` varchar(255) NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=62 ;

製品表

CREATE TABLE IF NOT EXISTS `products` (
  `id` int(11) NOT NULL auto_increment,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=65 ;

割り当て表

CREATE TABLE IF NOT EXISTS `interest_product_assignment` (
  `id` int(11) NOT NULL auto_increment,
  `interest_id` int(11) NOT NULL,
  `product_id` int(11) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `product` (`product_id`),
  KEY `interest` (`interest_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

この制約を追加しようとして失敗したようです-

ALTER TABLE `interest_product_assignment` ADD CONSTRAINT `product` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT;

ALTER TABLE `interest_product_assignment` ADD CONSTRAINT `interest` FOREIGN KEY (`interest_id`) REFERENCES `interest` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT;

製品レコードを削除しても、対応する割り当てレコードが削除されません。

これに関するいくつかの質問:

  1. これは、この種の制約の正しい構文ですか?
  2. テーブルの作成時にこれらの制約を追加していないこと、またはテーブルに既にデータを取得していることは問題ですか?
  3. 制約が正常に追加されたかどうかは、PHPMyADMIN のどこで確認できますか? それらへの参照がどこにも見つからないようで、PHPMyADMIN がエラー メッセージをスローせずに制約を無視したと思うようになりました。
4

1 に答える 1

1

外部キーを追加しても、MyISAM テーブルで警告/エラーは発生しませんが、サポートされていません。

外部キーを作成する前に MyISAM を InnoDB に変更する必要がありますが、これは完全に正常に機能します。

MySQLの公式マニュアルから:

後の段階で、MyISAM テーブルにも外部キー制約が実装されます。

http://dev.mysql.com/doc/refman/5.7/en/ansi-diff-foreign-keys.html

于 2013-07-07T07:47:35.970 に答える