MySQL表用varchar列作为外键

Ham*_*shi 16 mysql database-design foreign-keys relational-database

我试图创建一个varchar列作为外键的表,但MySql在创建表时给出了一个错误.我的查询是这样的:

CREATE TABLE network_classes (
    id TINYINT(1) UNSIGNED NOT NULL AUTO_INCREMENT,
    category VARCHAR(80) NOT NULL,
    PRIMARY KEY(id),
    KEY `key_1` (`id`,`category`)
)
ENGINE=InnoDB;


CREATE TABLE networks (
    id TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    category VARCHAR(80) NOT NULL,
    director_id TINYINT(3) UNSIGNED NULL,
    director_name VARCHAR(100) NULL,
    description VARCHAR(1000) NULL,
    last_modified TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    user_id SMALLINT UNSIGNED NULL,
    PRIMARY KEY(id),
    KEY `networks_fk1` (`category`),
    CONSTRAINT `networks_fk1` FOREIGN KEY (`category`) REFERENCES `network_classes` (`category`) ON DELETE NO ACTION,
    INDEX networks_index2471(name),
    INDEX networks_index2472(director_id, director_name)
)
ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

[Err] 1215 - Cannot add foreign key constraint
Run Code Online (Sandbox Code Playgroud)

我使用的是MySQL 5.6.12.如何重写我的查询来修复它?

nei*_*ldt 24

您只能使用引用唯一字段的外键.修改您的network_classes表,以便类别字段是唯一的,如下所示

 CREATE TABLE network_classes (
    id TINYINT(1) UNSIGNED NOT NULL AUTO_INCREMENT,
    category VARCHAR(80) NOT NULL,
    PRIMARY KEY(id),
    UNIQUE KEY `category_UNIQUE` (`category`),
    KEY `key_1` (`id`,`category`)
)
ENGINE=InnoDB;


CREATE TABLE networks (
    id TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    category VARCHAR(80) NOT NULL,
    director_id TINYINT(3) UNSIGNED NULL,
    director_name VARCHAR(100) NULL,
    description VARCHAR(1000) NULL,
    last_modified TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    user_id SMALLINT UNSIGNED NULL,
    PRIMARY KEY(id),
    KEY `networks_fk1` (`category`),
    CONSTRAINT `networks_fk1` FOREIGN KEY (`category`) REFERENCES `network_classes` (`category`) ON DELETE NO ACTION,
    INDEX networks_index2471(name),
    INDEX networks_index2472(director_id, director_name)
)
ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)

然后,您应该能够添加所需的外键


Ch *_*han 7

表中的列类型和引用的表与约束不匹配

为什么2个相同大小的varchar列在类型上不匹配?当然答案是明显的整理.事实证明,在新表中,列是UTF-8而不是引用表中的ASCII.改为ascii并完成.

  • 还值得一提的是,确保它们都是 InnoDB 表 (2认同)