1

我知道这已被要求分配,我很抱歉,但老实说我找不到答案。

这是我的管理员表:

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 属性一样,而且父表中有数据。任何机构都可以解释一下这里发生了什么吗?

4

1 回答 1

2

您无法在表post_user上的列上引用,因为您没有在其上定义键。要直接回答您的问题,您必须在列上添加一个键,admin_fnameadmins

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; 
于 2013-04-13T07:47:33.437 回答