MySQL不允许删除,即使删除级联集上存在FK关系

MySQL不允许删除,即使删除级联集上存在FK关系,mysql,database,cascading-deletes,Mysql,Database,Cascading Deletes,我正在从事一个项目,该项目利用MySQL数据库存储代码片段,供多个网站使用。对于每个内容片段,我还保留一个编辑历史记录表,每次更新片段时,我都会向其中添加一条记录。有时需要完全删除代码段以及任何相关的编辑历史记录。在设置DB时,我将外键关系设置为ON DELETE CASCADE,这样删除代码段将自动删除历史记录。但是,我得到以下错误: 查询中出错:从id=1的代码段中删除。无法删除或更新父行:外键约束失败(universal\u content\u repository/SNIPPET\u E

我正在从事一个项目,该项目利用MySQL数据库存储代码片段,供多个网站使用。对于每个内容片段,我还保留一个编辑历史记录表,每次更新片段时,我都会向其中添加一条记录。有时需要完全删除代码段以及任何相关的编辑历史记录。在设置DB时,我将外键关系设置为ON DELETE CASCADE,这样删除代码段将自动删除历史记录。但是,我得到以下错误:

查询中出错:从id=1的代码段中删除。无法删除或更新父行:外键约束失败(
universal\u content\u repository/SNIPPET\u EDIT\u HISTORY
,约束
fk\u SNIPPET\u EDIT\u HISTORY relationship13
外键(
SNIPPET\u id
)引用
SNIPPET
id

以下是我用来创建DB的代码以及关系:

/*Schema universal_content_repository*/
CREATE SCHEMA IF NOT EXISTS `universal_content_repository`
DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

USE `universal_content_repository`;

CREATE TABLE `universal_content_repository`.`USER` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Stores the ID for the User.',
`username` VARCHAR(20) NOT NULL, 
`first_name` VARCHAR(32) NOT NULL,
`last_name` VARCHAR(32) NOT NULL,
`is_active` VARCHAR(5) NOT NULL DEFAULT true,
`password` VARCHAR(32) NOT NULL,
`is_admin` BIT NOT NULL DEFAULT 0,
`prefers_wysiwyg` BIT DEFAULT 0,
PRIMARY KEY (`id`)
) COMMENT 'Stores information about all Users for the Universal Content Repository.' ENGINE=INNODB
ROW_FORMAT=DEFAULT;

CREATE TABLE `universal_content_repository`.`SNIPPET` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`title` VARCHAR(255) NOT NULL,
`content` TEXT NOT NULL,
`created_by` INT UNSIGNED,
`wysiwyg_editable` VARCHAR(6) NOT NULL DEFAULT true,
`is_enabled` BIT NOT NULL DEFAULT 1,
PRIMARY KEY (`id`)
) COMMENT 'Guarantees that no two snippets may have the same name or ID.' ENGINE=INNODB
ROW_FORMAT=DEFAULT;

CREATE TABLE `universal_content_repository`.`IMAGE` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL,
`url` TEXT NOT NULL,
`alt` VARCHAR(32),
PRIMARY KEY (`id`)
) ENGINE=INNODB
ROW_FORMAT=DEFAULT;

CREATE TABLE `universal_content_repository`.`IMAGE_IN_SNIPPET` (
`rel_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`snippet_id` INT UNSIGNED,
`image_id` INT UNSIGNED,
`position` INT COMMENT 'Stores the position of the image within the snippet, as notated in the snippet as [index]',
PRIMARY KEY (`rel_id`)
) ENGINE=INNODB
ROW_FORMAT=DEFAULT;

CREATE TABLE `universal_content_repository`.`SNIPPET_EDIT_HISTORY` (
`revision_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`editing_user` INT UNSIGNED,
`snippet_id` INT UNSIGNED,
`old_contents` TEXT NOT NULL COMMENT 'Stores the old contents of the snippet.',
`edit_date` DATETIME NOT NULL COMMENT 'Stores the DateTime of the edit.',
PRIMARY KEY (`revision_id`)
) ENGINE=INNODB
ROW_FORMAT=DEFAULT;

CREATE TABLE `universal_content_repository`.`SESSION` (
`id` VARCHAR(32) NOT NULL COMMENT 'Stores the Session ID',
`access` INT(10) UNSIGNED NOT NULL,
`data` TEXT,
PRIMARY KEY (`id`)
) ENGINE=INNODB
ROW_FORMAT=DEFAULT;

ALTER TABLE `universal_content_repository`.`USER` ADD UNIQUE `Identifiers` (`id`,`username`);

ALTER TABLE `universal_content_repository`.`SNIPPET` ADD UNIQUE `identifiers` (`title`,`id`);

ALTER TABLE `universal_content_repository`.`SNIPPET` ADD CONSTRAINT `fk_SNIPPETRelationship8` FOREIGN KEY (`created_by`) REFERENCES `universal_content_repository`.`USER`(`id`) MATCH SIMPLE ON UPDATE RESTRICT ON DELETE RESTRICT;

ALTER TABLE `universal_content_repository`.`IMAGE_IN_SNIPPET` ADD CONSTRAINT `fk_IMAGE_IN_SNIPPETRelationship10` FOREIGN KEY (`snippet_id`) REFERENCES `universal_content_repository`.`SNIPPET`(`id`) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE `universal_content_repository`.`IMAGE_IN_SNIPPET` ADD CONSTRAINT `fk_IMAGE_IN_SNIPPETRelationship11` FOREIGN KEY (`image_id`) REFERENCES `universal_content_repository`.`IMAGE`(`id`) MATCH SIMPLE ON UPDATE RESTRICT ON DELETE RESTRICT;

ALTER TABLE `universal_content_repository`.`SNIPPET_EDIT_HISTORY` ADD CONSTRAINT `fk_SNIPPET_EDIT_HISTORYRelationship12` FOREIGN KEY (`editing_user`) REFERENCES `universal_content_repository`.`USER`(`id`) MATCH SIMPLE ON UPDATE RESTRICT ON DELETE RESTRICT;

ALTER TABLE `universal_content_repository`.`SNIPPET_EDIT_HISTORY` ADD CONSTRAINT `fk_SNIPPET_EDIT_HISTORYRelationship13` FOREIGN KEY (`snippet_id`) REFERENCES `universal_content_repository`.`SNIPPET`(`id`) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE;
如果您想查看数据库的图形表示,可以在中查看。 对于没有SchemaBank帐户的用户,以下是ER:


有什么想法吗?

看起来你的代码是对的


如果可行,转储该数据库并将其恢复到另一台服务器上作为测试。如果INNODB和MySQL的内部状态不同步,那么在恢复到的服务器上应该会有一个性能良好的数据库

看起来您的代码是正确的


如果可行,转储该数据库并将其恢复到另一台服务器上作为测试。如果INNODB和MySQL的内部状态不同步,那么在恢复到的服务器上应该会有一个性能良好的数据库

Schemabank需要登录,所以它没有用。我继续为您添加了一个png。我不知道它为什么要这样做。我可以给你一个解决办法,在删除后触发,删除所有的
代码片段\u编辑\u历史
,但这只是解决问题的途径。Schemabank需要登录,所以它没有用。我继续为你添加了一个png。我不知道它为什么这样做。我可以以删除后触发器的形式为您提供一种解决方法,该触发器删除所有
代码段\u编辑\u历史记录
,但只是围绕问题进行路由。不幸的是,我无法将DB移动到另一台服务器,但我确实使用删除前触发器解决了问题。我想知道我是否应该用MySQL提交一份错误报告?你能在不破坏现有数据库的情况下在同一台服务器上恢复它吗?不,但因为我正在开发,数据库中只有测试数据,所以破坏数据库没有问题。删除数据库并从头开始是我在查看代码后做的第一件事,没有发现任何问题,我的问题也一直存在。不幸的是,我无法将数据库移动到另一台服务器,但我确实使用BEFORE DELETE触发器解决了这个问题。我想知道我是否应该用MySQL提交一份错误报告?你能在不破坏现有数据库的情况下在同一台服务器上恢复它吗?不,但因为我正在开发,数据库中只有测试数据,所以破坏数据库没有问题。删除数据库并从头开始使用它是我在查看代码后做的第一件事,没有发现任何问题,我的问题也一直存在。