MySQL Constraint没有正确添加

时间:2013-05-24 07:37:38

标签: mysql constraints

我从来没有像过去那样使用约束,而我正试图开始这样做。我有一个简单的查找表,它涉及服装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 ;

有人可以告诉我我做错了什么以及为什么它不会添加约束?提前谢谢。

1 个答案:

答案 0 :(得分:1)

为了使外键工作,所涉及的所有表必须具有Innodb引擎。你的表中只有一个是Innodb,而其他的是MyISAM - 这不起作用(在MySQL documentation中阅读更多相关信息)。

简单的解决方案是将所有表格更改为Innodb格式。