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配置不好。谢谢。