我从来没有像过去那样使用约束,而我正试图开始这样做。我有一个简单的查找表,它涉及服装ID和颜色ID。如果服装或颜色被删除,我显然希望删除关联。这是我的表结构:
CREATE TABLE IF NOT EXISTS `colors` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '',
`image` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=50 ;
CREATE TABLE IF NOT EXISTS `garments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`image` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=50 ;
CREATE TABLE IF NOT EXISTS `garments_colors` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`garment_id` int(11) unsigned NOT NULL,
`color_id` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=100 ;
我想添加的约束如下:
ALTER TABLE `garments_colors`
ADD CONSTRAINT `garments_colors_ibfk_1` FOREIGN KEY (`garment_id`) REFERENCES `garments` (`id`) ON DELETE CASCADE,
ADD CONSTRAINT `garments_colors_ibfk_2` FOREIGN KEY (`color_id`) REFERENCES `colors` (`id`) ON DELETE CASCADE;
查询运行成功,但是当我对底部附近的所有表进行可视化导出时,我没有看到我的新约束(只是现有的约束),而且garments_colors表有两个fk索引显示(当存在时,这不是典型的约束到位)。以下是运行alter table查询以尝试添加约束后服装颜色表的样子:
CREATE TABLE IF NOT EXISTS `garments_colors` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`garment_id` int(11) unsigned NOT NULL,
`color_id` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `garments_colors_ibfk_1` (`garment_id`),
KEY `garments_colors_ibfk_2` (`color_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=100 ;
有人可以告诉我我做错了什么以及为什么它不会添加约束?提前谢谢。
答案 0 :(得分:1)
为了使外键工作,所涉及的所有表必须具有Innodb引擎。你的表中只有一个是Innodb,而其他的是MyISAM - 这不起作用(在MySQL documentation中阅读更多相关信息)。
简单的解决方案是将所有表格更改为Innodb格式。