2013-05-24 5 views
0

Я никогда не использовал ограничения, как я должен был быть на протяжении многих лет, и я пытаюсь начать делать это. У меня есть простая таблица поиска, которая касается идентификаторов одежды и цветовых идентификаторов. Я, очевидно, хочу, чтобы ассоциации были удалены, если либо предмет одежды, либо цвет удалены. Вот мои структуры таблиц:MySQL Constraint не добавляет правильно

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, показывающих (что не типично, когда есть ограничение на месте). Вот что таблица одежды цвета выглядит как после того, как я запускаю альтер запрос таблицы, чтобы попытаться добавить ограничение:

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

Для того, чтобы внешние ключи работали, все задействованные столы должны иметь двигатель Innodb. Только одна из ваших таблиц - Innodb, другие - MyISAM, и это не сработает (подробнее об этом читайте в MySQL documentation).

Простым решением для вас является изменение всех ваших таблиц на формат Innodb.

+0

Спасибо @mvp. Я дам это выстрел и отчитаю. – pogeybait

+0

Теперь я получаю ужасный # 1005 - Не могу создать таблицу xxxxxx. # Sql-43df_22068 '(errno: 150). Предложения? – pogeybait

+0

Эта ошибка может возникнуть, если вы создаете FK для таблицы, которая еще не существует, или индекс, который ссылается на FK, еще не создан. Я предлагаю отредактировать ваш вопрос, чтобы предоставить дополнительную информацию - мы не можем читать ваши мысли. – mvp

Смежные вопросы