首页 > 解决方案 > 我在mysql中的表有什么问题?

问题描述

我要创建3个表。表“post”和“taxonomy”通过主键和外键连接到“taxonomy_relationship”表,但我不知道为什么会出现此错误:

1005 - 无法创建表 taxonomy_relationship(错误号:150“外键约束”格式不正确”)

CREATE TABLE `post`(
    id int not null AUTO_INCREMENT,
    title varchar(255) not null,
    content TEXT not null,
    PRIMARY KEY(id)
);

CREATE TABLE `taxonomy`(
    id int not null AUTO_INCREMENT,
    tax_title varchar(255) not null,
    type varchar(255) not null,
    PRIMARY KEY(id, tax_title)
);

CREATE TABLE taxonomy_relationship(
    id INT AUTO_INCREMENT,
    post_id int not null,
    title varchar(255) not null,
    PRIMARY KEY(id),
    FOREIGN KEY (post_id) 
        REFERENCES post(id) 
        ON DELETE CASCADE 
        ON UPDATE CASCADE
    FOREIGN KEY (title) 
        REFERENCES taxonomy(tax_title) 
        ON DELETE CASCADE 
        ON UPDATE CASCADE
);


当我使用“SHOW ENGINE INNODB STATUS”显示错误详细信息时,它返回:

> 2020-01-19 16:08:31 0x2fb8 表的外键约束错误blogtaxonomy_relationship:
FOREIGN KEY (title)
REFERENCES taxonomy(tax_title)
ON DELETE CASCADE
ON UPDATE CASCADE
):
在被引用的列作为第一列出现的被引用表中找不到索引,或者表中的列类型与被引用表不匹配为约束。请注意,使用 >= InnoDB-4.1.12 创建的表中 ENUM 和 SET 的内部存储类型发生了变化,并且旧表中的此类列不能被新表中的此类列引用。有关正确的外键定义,请参阅https://mariadb.com/kb/en/library/foreign-keys/。创建表blogtaxonomy_relationship外键约束失败。引用表中没有索引,其中引用列显示为“FOREIGN KEY (title)
REFERENCES taxonomy(tax_title)
ON DELETE CASCADE
ON UPDATE CASCADE
)”附近的第一列。

标签: mysqlforeign-keys

解决方案


您应该KEY title_idx (tax_title)taxonomy表上添加索引:

CREATE TABLE `taxonomy` (
   `id` int NOT NULL AUTO_INCREMENT,
   `tax_title` varchar(255) NOT NULL,
   `type` varchar(255) NOT NULL,
   PRIMARY KEY (`id`),
   KEY `title_idx` (`tax_title`)
);

创建外键后:

CREATE TABLE taxonomy_relationship(
    id INT AUTO_INCREMENT,
    post_id int not null,
    title varchar(255) not null,
    PRIMARY KEY(id),
    FOREIGN KEY (post_id) 
        REFERENCES post(id) 
        ON DELETE CASCADE 
        ON UPDATE CASCADE,
    FOREIGN KEY (title) 
        REFERENCES taxonomy(tax_title) 
        ON DELETE CASCADE 
        ON UPDATE CASCADE
);

您可以复制但按字段链接title的另一种方法:taxonomy_relationshipid

CREATE TABLE taxonomy_relationship(
    id INT AUTO_INCREMENT,
    post_id int not null,
    taxonomy_id int not null,
    PRIMARY KEY(id),
    FOREIGN KEY (post_id) 
        REFERENCES post(id) 
        ON DELETE CASCADE 
        ON UPDATE CASCADE,
    FOREIGN KEY (taxonomy_id) 
        REFERENCES taxonomy(id) 
        ON DELETE CASCADE 
        ON UPDATE CASCADE
);

推荐阅读