簡體   English   中英

MySQL在刪除級聯不起作用

[英]Mysql on delete cascade not working

我有桌子:

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM