ON DELETE CASCADE не работает в MySQL - PullRequest
2 голосов
/ 15 марта 2011

Я использую следующий SQL для создания таблицы с именем app_info:

CREATE TABLE IF NOT EXISTS `app_info` (
`_id` int(11) NOT NULL AUTO_INCREMENT,
`app_name` varchar(50) DEFAULT NULL,
`app_owner` varchar(50) DEFAULT NULL,
`last_update` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

Я использую следующий SQL для создания таблицы с именем tab_info:

CREATE  TABLE `myDB`.`tab_info` (
`_id` INT NOT NULL AUTO_INCREMENT ,
`app_id` INT NOT NULL ,
`tab_title` VARCHAR(15) NOT NULL ,
PRIMARY KEY (`_id`) ,
UNIQUE INDEX `app_id_UNIQUE` (`app_id` ASC) ,
INDEX `app_tab_key` (`app_id` ASC) ,
CONSTRAINT `app_tab_key`
  FOREIGN KEY (`app_id` )
  REFERENCES `myDB`.`app_info` (`_id` )
  ON DELETE CASCADE
  ON UPDATE CASCADE); 

Но когда я удаляю данные из таблицы первичного ключа, потерянные строки в таблице внешнего ключа не удаляются автоматически. Кто-нибудь знает, в чем может быть проблема?

1 Ответ

6 голосов
/ 15 марта 2011

Механизм хранения MyISAM не поддерживает ограничения внешнего ключа.Ограничение анализируется, но игнорируется.

Чтобы устранить проблему, используйте вместо этого движок InnoDB (для обеих таблиц).

CREATE TABLE ( ... ) ENGINE = InnoDB ... ;

Вместо того, чтобы отбрасывать таблицы и создавать их заново, вытакже можно изменить механизм хранения:

ALTER TABLE myDB.app_info ENGINE = InnoDB;
ALTER TABLE myDB.tab_info ENGINE = InnoDB;

После замены механизма вам нужно будет снова добавить ограничение внешнего ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...