0

多年来,我从来没有像我应该使用的那样使用约束,我正试图开始这样做。我有一个简单的查找表,将服装 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;

查询成功运行,但是当我对底部附近的所有表进行可视导出时,我看不到我的新约束(只是现有的约束),并且服装颜色表显示了两个 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 ;

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

4

1 回答 1

1

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

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

于 2013-05-24T07:47:34.940 回答