Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 错误1005-无法创建表(错误号:150)_Mysql_Sql Server_Database - Fatal编程技术网

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

Mysql 错误1005-无法创建表(错误号:150),mysql,sql-server,database,Mysql,Sql Server,Database,我犯了一个错误 错误1005-无法创建表错误号:150 无法发现错误。需要解决问题的帮助。您在门店上的主键定义为id、门店名称,但您试图仅基于一列从员工处FK到它,即 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

我犯了一个错误

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


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

您在门店上的主键定义为id、门店名称,但您试图仅基于一列从员工处FK到它,即

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 ;
您需要在复合外键中引用主键的两列

也就是说,这里似乎没有必要使用复合键,因为AUTO_INCREMENT已经是唯一的,并且是简单代理主键的最佳候选

相反,我会将两个表上的主键都更改为自动增量id

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

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

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;

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


为存储表创建一个索引就可以了。

为什么不先尝试创建存储表呢?请发送完整的查询。@user3576366我已经更新了。我不太确定您是否正确理解了这里的问题-您的原始表结构有一个复合主键,这是多余的,因为AUTO_INCREMENT本身已经是唯一的。如果您想保存联接,但需要在store表中的store_名称上添加唯一约束,则可以将store_名称用作外键。但我还是会放弃组合键。没有必要。非常感谢。实际上我没有创建索引。事实上,我对这个sql比较新鲜。再次感谢
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;
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 ;