无法在mysql中添加外键,其中字段是唯一索引

时间:2014-06-09 13:58:20

标签: mysql

我在添加基于AUTH_ISLE_CODE的外键时遇到问题:

Create Table: CREATE TABLE `AUTH_ACCOUNT` (
  `ACCOUNT_ID` int(11) NOT NULL AUTO_INCREMENT,
  `PASSWORD` varchar(20) DEFAULT NULL,
  ...
  `AUTH_ISLE_ID` int(11) NOT NULL DEFAULT '1',
  `AUTH_ISLE_CODE` varchar(5) NOT NULL DEFAULT 'AAAAA',
  PRIMARY KEY (`ACCOUNT_ID`),
  KEY `fk_ACCOUNT_ISLE` (`AUTH_ISLE_ID`),
  CONSTRAINT `fk_ACCOUNT_ISLE` FOREIGN KEY (`AUTH_ISLE_ID`) REFERENCES `AUTH_ISLE` (`ISLE_ID`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=166 DEFAULT CHARSET=utf8

Create Table: CREATE TABLE `AUTH_ISLE` (
  `ISLE_ID` int(11) NOT NULL AUTO_INCREMENT,
  `NAME` varchar(100) DEFAULT NULL,
  `CODE` varchar(5) NOT NULL DEFAULT 'AAAAA',
  PRIMARY KEY (`ISLE_ID`),
  UNIQUE KEY `CODE_UNIQUE` (`CODE`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8

我遇到的错误是:

ERROR 1005 (HY000): Can't create table 'masterdata.#sql-73c1_57910' (errno: 150)

这两个表与AUTH_ISLE_ID

的关系是否存在

编辑1 :您看到的SHOW CREATE TABLE是当前的情况。我正在尝试将约束添加到AUTH_ISLE_CODE - >来自AUTH_ISLE的代码

1 个答案:

答案 0 :(得分:1)

如果这是您尝试创建表的一系列查询,那么它将始终失败,因为您正在引用尚未创建的表REFERENCES AUTH_ISLE (ISLE_ID),请尝试创建第一个AUTH_ISLE表然后创建您的第二个表AUTH_ACCOUNT,当AUTH_ISLE出现时,您可以简单地引用其列

 CREATE TABLE `AUTH_ISLE` (
  `ISLE_ID` int(11) NOT NULL AUTO_INCREMENT,
  `NAME` varchar(100) DEFAULT NULL,
  `CODE` varchar(5) NOT NULL DEFAULT 'AAAAA',
  PRIMARY KEY (`ISLE_ID`),
  UNIQUE KEY `CODE_UNIQUE` (`CODE`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

CREATE TABLE `AUTH_ACCOUNT` (
  `ACCOUNT_ID` int(11) NOT NULL AUTO_INCREMENT,
  `PASSWORD` varchar(20) DEFAULT NULL,
  `AUTH_ISLE_ID` int(11) NOT NULL DEFAULT '1',
  `AUTH_ISLE_CODE` varchar(5) NOT NULL DEFAULT 'AAAAA',
  PRIMARY KEY (`ACCOUNT_ID`),
  KEY `fk_ACCOUNT_ISLE` (`AUTH_ISLE_ID`),
  CONSTRAINT `fk_ACCOUNT_ISLE` FOREIGN KEY (`AUTH_ISLE_ID`) 
  REFERENCES `AUTH_ISLE` (`ISLE_ID`) 
  ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=166 DEFAULT CHARSET=utf8;

Demo

insert into AUTH_ISLE (NAME,CODE) values('Test','Test');
insert into AUTH_ACCOUNT (PASSWORD,AUTH_ISLE_ID,AUTH_ISLE_CODE) 
values('Test',last_insert_id(),'Test');

Insert Demo