Mysql 错误1005-无法创建表(错误号:150)
我犯了一个错误 错误1005-无法创建表错误号:150Mysql 错误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
无法发现错误。需要解决问题的帮助。您在门店上的主键定义为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 ;