【问题标题】:Mysql on delete cascade not working删除级联上的Mysql不起作用
【发布时间】:2018-05-30 08:32:20
【问题描述】:

我有桌子:

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 表的一个或多个条目,则删除的文件中没有条目。谁能告诉我为什么?

【问题讨论】:

    标签: mysql cascade cascading-deletes


    【解决方案1】:

    当引用的 id 将在 files 上删除时,您现在拥有的约束将从 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;
    

    【讨论】:

    • 感谢您的回答,但是当我尝试使用外键创建文件表时,我收到错误消息:无法添加外键约束
    猜你喜欢
    • 1970-01-01
    • 2013-06-22
    • 2013-03-03
    • 2012-11-18
    • 2011-06-11
    • 2018-06-04
    • 1970-01-01
    相关资源
    最近更新 更多