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)
无法发现错误。需要帮助解决问题。
答案 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将为您创建主表上的索引(如果不存在),但不会将此过程自动化到引用的表(源表)上。
为商店表创建一个索引,它应该没问题。