错误#1005 - 无法创建表(错误号:150)

时间:2015-01-09 05:41:23

标签: mysql sql-server database

CREATE TABLE IF NOT EXISTS `store` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `store_name` varchar(100) NOT NULL,
  PRIMARY KEY (`id`,`store_name`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `employee` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `employee_name` varchar(100) NOT NULL,
  `employee_phone` varchar(20) NOT NULL,
  `employee_mail` varchar(70) NOT NULL,
  `employee_username` varchar(100) NOT NULL,
  `employee_password` varchar(50) NOT NULL,
  `store_name` varchar(100) NOT NULL,
  `date_enter` varchar(20) NOT NULL,
  PRIMARY KEY (`id`,`employee_name`,`employee_username`),
 CONSTRAINT FOREIGN KEY (`store_name`) REFERENCES `store` (`store_name`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

我收到错误

  

错误#1005 - 无法创建表格(错误号码:150)

无法发现错误。需要帮助解决问题。

2 个答案:

答案 0 :(得分:0)

商店中的主键定义为(id,store_name)但您正试图仅基于一列从employee开始FK,即

CONSTRAINT FOREIGN KEY (`store_name`) REFERENCES `store` (`store_name`)

您需要在复合外键中引用主键的两列。

也就是说,似乎没有必要在这里使用复合键,因为AUTO_INCREMENT已经是唯一的,并且是一个简单的Surrogate主键的理想选择。

我会改为将两个表上的主键更改为AUTO_INCREMENT id。

CREATE TABLE IF NOT EXISTS `store` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `store_name` varchar(100) NOT NULL,
  PRIMARY KEY (`id`) -- *** Simple surrogate primary key
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `employee` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `storeid` int(11) NOT NULL, -- FK to the surrogate PK, not the natural store name
  -- ... etc
  PRIMARY KEY (`id`) -- *** Simple surrogate primary key
  CONSTRAINT FOREIGN KEY (`storeid`) REFERENCES `store` (`id`) 
         ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

*编辑,重新,我想使用store_name作为外键

除了fk主键之外,您还可以通过唯一键约束通过外键强制实现引用完整性:

CREATE TABLE IF NOT EXISTS `store` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `store_name` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE key `u_store`(`store_name`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `employee` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  -- Other fields here
  `store_name` varchar(100) NOT NULL,
  `date_enter` varchar(20) NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT FOREIGN KEY (`store_name`) REFERENCES `store` (`store_name`) 
     ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

答案 1 :(得分:0)

您需要在源表上创建索引才能使外键工作。出于某种原因,MySql将为您创建主表上的索引(如果不存在),但不会将此过程自动化到引用的表(源表)上。

为商店表创建一个索引,它应该没问题。