Mysql 删除级联不起作用

标签 mysql cascade cascading-deletes

我有 table :

DROP TABLE IF EXISTS `files`;
CREATE TABLE IF NOT EXISTS `files` (
  `id` VARCHAR(36)  NOT NULL,
  `name` VARCHAR(50) NOT NULL,
  `extension` VARCHAR(5) NOT NULL,
  `version` INT(11) NOT NULL,
  `date` DATE NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

和标签文件:

DROP TABLE If EXISTS  `tags_files`;
CREATE TABLE IF NOT EXISTS `tags_files` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `tag_id` INT(11) NOT NULL,
  `file_id` VARCHAR(36) NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT FOREIGN KEY (`file_id`) REFERENCES `files` (`id`) ON DELETE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

如果我现在删除tags_files表中的一个或多个条目,则删除的文件中没有任何条目。谁能告诉我为什么?

最佳答案

files 上引用的 ID 被删除时,您现在拥有的约束将从 tags_files 中删除。

如果您需要在从 tags_files 中删除时自动从 files 中删除,则约束必须在 files 表上。

像这样:

DROP TABLE IF EXISTS `files`;
CREATE TABLE IF NOT EXISTS `files` (
    `id` VARCHAR(36)  NOT NULL,
    `name` VARCHAR(50) NOT NULL,
    `extension` VARCHAR(5) NOT NULL,
    `version` INT(11) NOT NULL,
    `date` DATE NOT NULL,
    PRIMARY KEY (`id`),
    CONSTRAINT FOREIGN KEY (`id`) REFERENCES `tags_files` (`file_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
and TagsFiles:

DROP TABLE If EXISTS  `tags_files`;
CREATE TABLE IF NOT EXISTS `tags_files` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `tag_id` INT(11) NOT NULL,
    `file_id` VARCHAR(36) NOT NULL,
    PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

在上面的例子中你会得到一个错误,因为 MySQL 不允许对 varchar 类型进行约束。如果你把它改成 char 就可以了。但由于限制,您还需要更改执行查询的顺序。这样做:

DROP TABLE IF EXISTS `files`;
DROP TABLE If EXISTS  `tags_files`;

CREATE TABLE IF NOT EXISTS `tags_files` (
    `id` INT(11) NOT NULL,
    `tag_id` INT(11) NOT NULL,
    `file_id` char(36) NOT NULL,
    PRIMARY KEY (`file_id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `files` (
    `id` char(36)  NOT NULL,
    `name` VARCHAR(50) NOT NULL,
    `extension` VARCHAR(5) NOT NULL,
    `version` INT(11) NOT NULL,
    `date` DATE NOT NULL,
    PRIMARY KEY (`id`),
    CONSTRAINT FOREIGN KEY (`id`) REFERENCES `tags_files` (`file_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

关于Mysql 删除级联不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50599952/

相关文章:

php - 如何从Codeigniter MYSQL中的大数据中获取员工的第一次和最后一次登录?

mysql - Rails+MySQL 在生产环境中:数据库配置未指定适配器 (ActiveRecord::AdapterNotSpecified)

php - 将字符串添加到除最后一个之外的所有循环项目

python - 删除级联的 Django 在 PostgreSQL 中没有产生正确的约束

ef-code-first - EF 4.1 RC : Weird Cascade Delete

MySql upsert和自动增量导致间隙

opencv - 训练级联分类器来检测论文

mysql - MariaDB/MySQL 外键约束 : possible to request cascade at time of delete?

java - 删除非级联的自引用实体

级联删除的 SQL 输出