代码之家  ›  专栏  ›  技术社区  ›  eldios1981

mysql on delete cascade不工作

  •  0
  • eldios1981  · 技术社区  · 7 年前

    我有桌子:

    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;
    

    如果现在删除“标记文件”表中的一个或多个条目,则删除的文件中没有条目。有人能告诉我为什么吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Kostas    7 年前

    现在的约束将从中删除 tags_files 当引用的ID将在上被删除时 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;