Mysql: добавление внешнего ключа не дает предупреждение / ошибка в таблицах MyISAM - PullRequest
4 голосов
/ 01 января 2011

Вот таблица, которую я сделал:

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 ]

4 голосов
/ 01 января 2011

Механизм InnoDB обычно (если у вас нет, например, индекса fulltext ), поскольку InnoDB допускает транзакций , внешних ключей и * 1007.* блокировка строки , например.

В тестовой базе данных выполните

  ALTER TABLE notes ENGINE = InnoDB;
  ALTER TABLE notetypes ENGINE = InnoDB;

(и любые другие соответствующие - может быть, все - таблицы)

и убедитесь, чтоу вас нет побочных эффектов (см. Таблица изменения Mysql ).

Проверьте также параметры, относящиеся к InnoDB (в my.sql), См. также движок Mysql InnoDB .

4 голосов
/ 01 января 2011

myISAM не поддерживает ссылочную целостность. кажется, что законно добавлять такие ограничения и, следовательно, не допускать ошибок, хотя эти ограничения не будут применены, пока ядром является myISAM. Тем не менее, он хранит созданные ключи, чтобы пользователь мог видеть, что было задумано.

...