我已经阅读了无数线程,但仍然遗漏了一些东西。 当我从任一表中删除一行时,不会发生约束或级联。
我的目标是级联删除所有子行。
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 */
当我执行删除时,删除行没有错误。 哪个表无所谓。
非常感谢任何帮助。
答案 0 :(得分:1)
您已指定DELETE
CASCADE
规则。
我们希望从父表中删除成功,表中与外键引用相关的行也将被删除。我们不会指望任何错误。
如果希望代码中的DELETE操作抛出错误,则使用DELETE规则RESTRICT
定义外键引用。
我建议您验证是否已启用FOREIGN_KEY_CHECKS
,并且实际定义了外键约束(即添加约束的ALTER TABLE语句成功。我从未尝试过指定{{1} }作为更新规则;我知道在没有指定规则时它是默认值,但我总是指定NO ACTION
,RESTRICT
或CASCADE
。)同时验证表格实际上是在使用InnoDB存储引擎。
SET NULL
答案 1 :(得分:1)
<强>理论值:强>
对于您的子表(test_types
),您提到了ON DELETE CASCADE
;这意味着从父表(test_core_types
)中删除一行时;同样的删除也会被级联到子表(S),并且子表中相应的相关行将被删除。
删除查询后;如果您尝试从两个表中选择,您将找到0行。这是ON DELETE CASCADE
的实际行为。
对于Real示例,请检查下面提到的小提琴链接