Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL FK Cascade-看不到我的错误_Mysql_Foreign Keys_Cascade - Fatal编程技术网

MySQL FK Cascade-看不到我的错误

MySQL FK Cascade-看不到我的错误,mysql,foreign-keys,cascade,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_t

我已经读了无数关于这方面的文章,但仍然遗漏了一些东西。 当我从表中删除一行时,没有约束或级联发生

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

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 */
执行删除操作时,删除行时不会出现错误。 不管是哪张桌子


非常感谢您的帮助。

您已经指定了
删除
级联规则

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

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


我建议您确认启用了
外键检查
,并且实际定义了外键约束(即,添加约束的ALTER TABLE语句成功。我从未尝试将
无操作
指定为更新规则;我知道这是未指定规则时的默认值,但我始终指定
限制
级联
设置为空
)还要验证表是否实际使用InnoDB存储引擎

SHOW VARIABLES LIKE '%foreign_key_checks%' ;
SHOW CREATE TABLE `test_types` ;

理论:

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

在删除查询之后;如果您尝试从两个表中进行选择,您将发现存在0行。这是删除级联的
的实际行为

例如,检查下面提到的小提琴链接


是的,我希望级联删除子行。我编辑了问题。“父”是删除,但这对“子”行没有影响。这就是我被卡住的地方。它显示了约束。我想这是服务器。我在某一点上遇到了约束,并开始忙于优化MySQL,出于好奇准备重新安装。感谢您的帮助!+1请参见上文,添加了更多信息。子行仍然存在,不确定原因。@JonC.,这是不正确的,不可能的。是吗检查了我在回答中提供的fiddle链接。我已经根据您发布的代码创建了fiddle。它工作得很好。检查fiddle链接。您一定是做错了什么。啊哈!您让我想到了…检查了我的其他mysql服务器,它工作了!我的.cnf配置不好。谢谢。