Mysql: добавление внешнего ключа не дает предупреждение / ошибка в таблицах MyISAM
Вот таблица, которую я сделал:
mysql> show create table notes;
+-------+----------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------+
| notes | CREATE TABLE `notes` (
`id` int(11) NOT NULL auto_increment,
`note` text NOT NULL,
`status` enum('active','hidden','deleted','followup','starred') default NULL,
`created` datetime NOT NULL,
`last_updated` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+-------+----------------------------------------+
Я пытаюсь добавить ограничение внешнего ключа:
mysql> alter table notes add constraint foreign key(`id`) references `notetypes`.`id` on update cascade on delete restrict;
Query OK, 0 rows affected (0.15 sec)
Records: 0 Duplicates: 0 Warnings: 0
Нет ошибок! Нет предупреждений! По этой причине я уже некоторое время использую внутреннюю базу данных без внешних ключей (если они присутствуют). Любая идея, если это ошибка или я делаю что-то не так? Какие-нибудь обходные пути или варианты в mysql, которые избежали бы таких ловушек?
$ mysql --version
mysql Ver 14.12 Distrib 5.0.75, for debian-linux-gnu (i486) using readline 5.2
Спасибо
JP
2 ответа
Механизм InnoDB обычно следует использовать (если, например, у вас нет полнотекстового индекса), поскольку InnoDB, например, допускает транзакции, внешние ключи и блокировку строк.
В тестовой базе данных выполните
ALTER TABLE notes ENGINE = InnoDB;
ALTER TABLE notetypes ENGINE = InnoDB;
(и любые другие соответствующие - может быть, все - таблицы)
и убедитесь, что у вас нет побочных эффектов (см. Mysql Alter Table).
Проверьте также параметры, специфичные для InnoDB (в my.sql
) См. Также движок Mysql InnoDB.
myISAM не делает ссылочную целостность. кажется, что законно добавлять такие ограничения и, следовательно, не допускать ошибок, хотя ограничения не будут применены, пока ядром является myISAM. Тем не менее, он хранит созданные ключи, чтобы пользователь мог видеть, что было задумано.