0

我有两个代表兴趣和产品的表格。我正在实现它们之间的 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 回答