在表创建MySQL之后添加表引用约束

时间:2013-07-07 07:33:56

标签: php mysql database many-to-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忽略了我的约束而没有抛出错误消息。

1 个答案:

答案 0 :(得分:1)

添加外键不会在MyISAM表上发出警告/错误,但不支持。

在创建外键之前,您需要将MyISAM更改为InnoDB,它将完美地运行。

来自官方MySQL手册:

  

在稍后阶段,将实施外键约束   MyISAM表也是

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