MySQL FK Cascade - 没有看到我的错误

时间:2014-05-18 02:30:24

标签: mysql foreign-keys cascade

我已经阅读了无数线程,但仍然遗漏了一些东西。 当我从任一表中删除一行时,不会发生约束或级联。

我的目标是级联删除所有子行。

CREATE SCHEMA IF NOT EXISTS `my_schema`
  DEFAULT CHARACTER SET latin1;
USE `my_schema`;

SET foreign_key_checks = 0;

DROP TABLE IF EXISTS `test_types`;
DROP TABLE IF EXISTS `test_core_types`;

SET foreign_key_checks = 1;

-- -----------------------------------------------------
-- Table `test_core_types`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test_core_types` (
  `test_core_type_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `data`                 VARCHAR(100)     NOT NULL,
  PRIMARY KEY (`test_core_type_id`))
  ENGINE = InnoDB
  AUTO_INCREMENT = 1;

CREATE UNIQUE INDEX `test_core_types__data_UNIQUE` ON `test_core_types` (`data` ASC);

-- -----------------------------------------------------
-- Table `test_types`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test_types` (
  `test_type_id`      SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  `test_core_type_id` INT(10) UNSIGNED     NOT NULL,
  `name`                 VARCHAR(45)          NOT NULL,
  `is_viewable`          TINYINT(1) UNSIGNED  NOT NULL DEFAULT '1',
  PRIMARY KEY (`test_type_id`))
  ENGINE = InnoDB
  AUTO_INCREMENT = 1;

CREATE UNIQUE INDEX `test_types__name_UNIQUE` ON `test_types` (`name` ASC);
CREATE INDEX `idx_test_core_type_00` ON `test_types` (`test_core_type_id` ASC);

ALTER TABLE `test_types`
ADD CONSTRAINT `fk_test_core_type_00`
FOREIGN KEY (`test_core_type_id`)
REFERENCES `test_core_types` (`test_core_type_id`)
  ON DELETE CASCADE
  ON UPDATE NO ACTION;

插入:

INSERT INTO `test_core_types` (`test_core_type_id`, `data`) VALUES ( 1, 'General');
INSERT INTO `test_types` (`test_type_id`, `test_core_type_id`, `name`, `is_viewable`) VALUES ( 1, 1, 'My General Item', 1);

删除:

DELETE FROM `test_core_types` WHERE `test_core_type_id` = 1;

结果:

SELECT * FROM `test_core_types`;
/* --> Row Deleted */

SELECT * FROM `test_types`;
/* --> Row still exists */

当我执行删除时,删除行没有错误。 哪个表无所谓。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您已指定DELETE CASCADE规则。

我们希望从父表中删除成功,表中与外键引用相关的行也将被删除。我们不会指望任何错误。

如果希望代码中的DELETE操作抛出错误,则使用DELETE规则RESTRICT定义外键引用。


我建议您验证是否已启用FOREIGN_KEY_CHECKS,并且实际定义了外键约束(即添加约束的ALTER TABLE语句成功。我从未尝试过指定{{1} }作为更新规则;我知道在没有指定规则时它是默认值,但我总是指定NO ACTIONRESTRICTCASCADE。)同时验证表格实际上是在使用InnoDB存储引擎。

SET NULL

答案 1 :(得分:1)

<强>理论值:

对于您的子表(test_types),您提到了ON DELETE CASCADE;这意味着从父表(test_core_types)中删除一行时;同样的删除也会被级联到子表(S),并且子表中相应的相关行将被删除。

删除查询后;如果您尝试从两个表中选择,您将找到0行。这是ON DELETE CASCADE的实际行为。

对于Real示例,请检查下面提到的小提琴链接

http://sqlfiddle.com/#!2/33014e/1