mysql - 无法创建表(errno : 150)

标签 mysql sql database-design foreign-keys

我知道有人问过这个问题,很抱歉,老实说我找不到答案。

这是我的管理员表:

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/

相关文章:

mysql - 如何在mysql中使用另一个表的列来填充列

mysql - 保持表行克隆的有效方法

mysql - MySQL 十进制字段的正确默认值是多少?

php - 获取项目列表的更好方法 : cached serialized data vs database queries or other?

python - 可以找到重新定位的库的 virtualenv(比如 MySQLdb 的 mysqlclient 库)

PHP PDO Select 查询不从数据库中选择行

sql - 从 SQL Server CE 迁移到 SQL Server Express

mysql - 如何在 mysql 中使用删除级联?

hibernate - 为什么Hibernate文档建议将联接表用于一对多关系?

mysql - 选择一个数字,检查数据库是否存在,如果不存储,则重复