无法在数据库中创建外键

时间:2018-04-30 04:17:26

标签: mysql database-design foreign-keys relational-database

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

CREATE TABLE `survey_hesco_subdivision` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`circle_code` VARCHAR(100) DEFAULT NULL,
`name` VARCHAR(100) DEFAULT NULL,
`circle_name` VARCHAR(100) DEFAULT NULL,
`division_code` VARCHAR(100) DEFAULT NULL,
`sub_div_code` VARCHAR(100) NOT NULL,
`division_name` VARCHAR(100) DEFAULT NULL,
PRIMARY KEY (`id`,`sub_div_code`),
KEY `id` (`id`)
) ENGINE=INNODB AUTO_INCREMENT=91 DEFAULT CHARSET=latin1;

上表已经在使用

Create table `accurate_mam`.`meter_ping`(  
`id` int(11) NOT NULL AUTO_INCREMENT,
`meter_id` int(11) NOT NULL,
`meter_msn` varchar(100),
`sub_div_code` varchar(100) NOT NULL,
`sub_div_name` varchar(100),
primary key (`id`),
constraint `FK_PING_METER_ID` foreign key (`meter_id`) references 
`accurate_mam`.`meters`(`id`) on delete Cascade,
constraint `FK_PIN_SUB_DIV` foreign key (`sub_div_code`) references 
`accurate_mam`.`survey_hesco_subdivision`(`sub_div_code`) on delete Cascade
) ENGINE=InnoDB charset=latin1 collate=latin1_swedish_ci 

我得到的错误是

  

错误号码:1005   错误消息:无法创建表accurate_mammeter_ping(错误:150“外键约束形成错误”)

我已经调查了这个question

2 个答案:

答案 0 :(得分:1)

  

MySQL需要外键和引用键上的索引,以便外键检查可以快速而不需要表扫描。在引用表中,必须有一个索引,其中外键列以相同的顺序列为第一列。

     

InnoDB允许外键引用任何索引列或组   列。但是,在引用的表中,必须有一个索引   其中引用的列被列为的第一列   同样的顺序。

因此,在创建子表之前,只需创建一个这样的索引:

CREATE INDEX `idx_survey_hesco_subdivision_sub_div_code` ON survey_hesco_subdivision(sub_div_code);

尽管在关系中使用非唯一列作为参考列并非最佳做法。在这种情况下,DELETE CASCADE将无法正常运作。我建议你也在主表的sub_div_code上创建一个唯一的密钥。

有关详细信息,请参阅this

来源:Cannot add foreign key - StackOverflow

答案 1 :(得分:0)

您是否已经开始CREATE TABLE meters了?该表丢失导致错误。我们看一下CREATE