我知道有人问过这个问题,很抱歉,老实说我找不到答案。
这是我的管理员表:
CREATE TABLE `admins` (
`admin_id` int(11) NOT NULL AUTO_INCREMENT,
`admin_user` varchar(15) NOT NULL,
`admin_password` varchar(15) NOT NULL,
`admin_fName` varchar(20) NOT NULL,
`admin_lName` varchar(20) NOT NULL,
PRIMARY KEY (`admin_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
我正在尝试创建以引用 admin_fname 的表:
CREATE TABLE IF NOT EXISTS posts(
post_id INT NOT NULL AUTO_INCREMENT,
post_title varchar(50),
post_content varchar(255),
post_user varchar(20) NOT NULL,
PRIMARY KEY (post_id),
FOREIGN KEY (post_user) REFERENCES admins(admin_fName)
) ENGINE = INNODB;
post_user好像和admin_fname有一样的属性,而且父表里有数据。任何人都可以解释这里发生了什么吗?
最佳答案
您不能在 admins
表的 admin_fname
列上引用 post_user
,因为您没有在其上定义键。要直接回答你的问题,你必须在列上添加一个键,
CREATE TABLE `admins`
(
`admin_id` int(11) NOT NULL AUTO_INCREMENT,
`admin_user` varchar(15) NOT NULL,
`admin_password` varchar(15) NOT NULL,
`admin_fName` varchar(20) NOT NULL,
`admin_lName` varchar(20) NOT NULL,
KEY (admin_fName), -- <<== adding key
PRIMARY KEY (`admin_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
但引用 NON_UNIQUE
列并不是一个好主意,因为从长远来看,具有相同 fname
的用户的记录可能会混合。更好的设计是让表格保持原样。在表 posts
上添加一个引用其主键的列。
CREATE TABLE `admins`
(
`admin_id` int(11) NOT NULL AUTO_INCREMENT,
`admin_user` varchar(15) NOT NULL,
`admin_password` varchar(15) NOT NULL,
`admin_fName` varchar(20) NOT NULL,
`admin_lName` varchar(20) NOT NULL,
PRIMARY KEY (`admin_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS posts
(
post_id INT NOT NULL AUTO_INCREMENT,
post_title varchar(50),
post_content varchar(255),
admin_id int(11) NOT NULL,
PRIMARY KEY (post_id),
FOREIGN KEY (admin_id) REFERENCES admins(admin_id)
) ENGINE = INNODB;
关于mysql - 无法创建表(errno : 150),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15985526/