错误 #1005 - 无法创建 table (errno: 150)

error #1005 - Can't create table (errno: 150)

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 ;

我遇到错误

error #1005 - Can't create table (errno: 150)

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

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

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

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

也就是说,似乎没有必要在这里使用复合键,因为 AUTO_INCREMENT 已经是唯一的,并且非常适合简单的代理主键。

我会改为将两个表上的主键更改为 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 ;

您需要在源上创建索引 table 以便外键起作用。出于某种原因 MySql 将在主 table 上为您创建索引(如果不存在),但不会将此过程自动化到引用的 table(来源 table).

为商店建立索引table,应该没问题。