我正在尝试创建一个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。如何重写我的查询来修复它?
答案 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_classes
。category
字段上创建索引:
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)