MySQL表用varchar列作为外键

时间:2013-08-22 14:23:04

标签: 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;

我收到此错误:

[Err] 1215 - Cannot add foreign key constraint

我正在使用MySQL 5.6.12。如何重写我的查询来修复它?

4 个答案:

答案 0 :(得分:20)

您只能使用引用唯一字段的外键。修改您的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;

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

答案 1 :(得分:7)

  

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

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

答案 2 :(得分:1)

需要对FOREIGN KEY约束的目标编制索引。通常,它是PRIMARY KEY所以这不是问题,但在你的情况下它不是(虽然它是复合键的一部分,这还不够)

network_classescategory字段上创建索引:

CREATE INDEX category_idx ON network_classes(category);

然后重新创建networks表。

答案 3 :(得分:0)

in

CONSTRAINT `networks_fk1` FOREIGN KEY (`category`)
REFERENCES `network_classess` (`category`) ON DELETE NO ACTION,

您使用 network_classess 而不是 network_classes (如在您的创建表脚本中),因此该表不存在。

修改

约束的名称与密钥(networks_fk1)的名称相同。

我更好地阅读了你的DDL。

你的表network_classes有一个主键ID,所以正确把外键作为一个字段来链接你的id字段,类别字段不能出现在你的表网络中,但我认为你必须把fk_network_class(作为int)链接到id(of network_classes)