错误 #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,应该没问题。
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,应该没问题。