MYSQL 1215无法添加外键约束

MYSQL 1215无法添加外键约束,mysql,Mysql,问题在边界表列GroupDim.FacultyID和FacultyDim.FacultyID上,数据类型是identityBIGINT这是OLAP多维数据集的数据存储,其中Rating\u facts存储了我研究的问题的结果。没有签名的表格是过渡性的,用于附加数据进行分析。可能需要划分此表格 DROP TABLE IF EXISTS BlockDim; CREATE TABLE BlockDim ( BlockKey bigint NOT NULL AUTO_INCREMENT,

问题在边界表列
GroupDim.FacultyID
FacultyDim.FacultyID
上,数据类型是identity
BIGINT
这是OLAP多维数据集的数据存储,其中Rating\u facts存储了我研究的问题的结果。没有签名的表格是过渡性的,用于附加数据进行分析。可能需要划分此表格

  DROP TABLE IF EXISTS BlockDim;
CREATE TABLE BlockDim (
    BlockKey bigint NOT NULL AUTO_INCREMENT,
    BlockID bigint NOT NULL,
    BlockName varchar(32) NOT NULL,
    PRIMARY KEY (BlockKey)
)ENGINE=InnoDB;

DROP TABLE IF EXISTS FacultyDim;
CREATE TABLE FacultyDim (
    FacultyKey bigint NOT NULL AUTO_INCREMENT,
    FacultyID bigint NOT NULL,
    FacultyName varchar(32) NOT NULL,
    PRIMARY KEY (FacultyKey, FacultyID)
)ENGINE=InnoDB;

DROP TABLE IF EXISTS `Group`; 
CREATE TABLE `Group` (
    GroupID bigint NOT NULL,
    FacultyID bigint NOT NULL,
    GroupName varchar(32) NOT NULL,
    PRIMARY KEY (GroupID),
    FOREIGN KEY (FacultyID) REFERENCES FacultyDim(FacultyID) 
)ENGINE=InnoDB;

DROP TABLE IF EXISTS Subblock; 
CREATE TABLE Subblock (
    SubblockKey bigint NOT NULL AUTO_INCREMENT,
    SubblockID bigint NOT NULL,
    BlockID bigint NOT NULL,
    SubblockName varchar(32) NOT NULL,
    PRIMARY KEY (SubblockKey)
)ENGINE=InnoDB;

DROP TABLE IF EXISTS Paragraph; 
CREATE TABLE Paragraph (
    ParagraphKey bigint NOT NULL AUTO_INCREMENT,
    ParagraphID bigint NOT NULL,
    SubblockID bigint NOT NULL,
    ParagraphName varchar(64) NOT NULL,
    PRIMARY KEY (ParagraphKey)
)ENGINE=InnoDB;

DROP TABLE IF EXISTS RatingDim; 
CREATE TABLE RatingDim (
    RatingKey bigint NOT NULL AUTO_INCREMENT,
    RatingID bigint NOT NULL,
    ParagraphID bigint NOT NULL,
    Score double NOT NULL,
    StageOfApprove int NOT NULL,
    Comment varchar(128) NOT NULL,
    `Date` DATE NOT NULL,
    PRIMARY KEY (RatingKey)
)ENGINE=InnoDB;

DROP TABLE IF EXISTS TimeDim; 
CREATE TABLE TimeDim (
    TimeKey bigint NOT NULL AUTO_INCREMENT,
    `Date` DATE NOT NULL,
    DayOfWeek varchar(16) NOT NULL,
    `Month` varchar(16) NOT NULL,
    `Year` varchar(4) NOT NULL,
    PRIMARY KEY (`TimeKey`)
)ENGINE=InnoDB;

DROP TABLE IF EXISTS Rating_Fact;
CREATE TABLE Rating_Fact (
    TimeKey bigint NOT NULL,
    BlockKey bigint NOT NULL,
    FacultyKey bigint NOT NULL,
    RatingKey bigint NOT NULL,
    PopularBlock bigint NOT NULL,
    AvgFacultyScore bigint NOT NULL,
    StudentsMaxRating bigint NOT NULL,
    StudentsNotApprovedRating bigint NOT NULL,
    PRIMARY KEY (TimeKey,BlockKey,FacultyKey,RatingKey),
    FOREIGN KEY (TimeKey) REFERENCES TimeDim(TimeKey),
    FOREIGN KEY (BlockKey) REFERENCES BlockDim(BlockKey),
    FOREIGN KEY (FacultyKey) REFERENCES FacultyDim(FacultyKey),
    FOREIGN KEY (RatingKey) REFERENCES RatingDim(RatingKey)
)ENGINE=InnoDB;

首先,您必须检查您的表体系结构。然后尝试以下两种解决方案

解决方案1:-

 DROP TABLE IF EXISTS FacultyDim;
    CREATE TABLE FacultyDim (
        FacultyKey bigint NOT NULL AUTO_INCREMENT,
        FacultyID bigint NOT NULL,
        FacultyName varchar(32) NOT NULL,
        PRIMARY KEY (FacultyKey, FacultyID)
    )ENGINE=InnoDB;

    DROP TABLE IF EXISTS `Group`; 
    CREATE TABLE `Group` (
        GroupID bigint NOT NULL,
        FacultyID bigint NOT NULL,
        GroupName varchar(32) NOT NULL,
        PRIMARY KEY (GroupID),
        FOREIGN KEY (FacultyID) REFERENCES FacultyDim(FacultyID,FacultyKey) 
    )ENGINE=InnoDB;
解决方案2:-

DROP TABLE IF EXISTS FacultyDim;
CREATE TABLE FacultyDim (
    FacultyKey bigint NOT NULL AUTO_INCREMENT,
    FacultyID bigint NOT NULL,
    FacultyName varchar(32) NOT NULL,
    PRIMARY KEY (FacultyID)
)ENGINE=InnoDB;

DROP TABLE IF EXISTS `Group`; 
CREATE TABLE `Group` (
    GroupID bigint NOT NULL,
    FacultyID bigint NOT NULL,
    GroupName varchar(32) NOT NULL,
    PRIMARY KEY (GroupID),
    FOREIGN KEY (FacultyID) REFERENCES FacultyDim(FacultyID) 
)ENGINE=InnoDB;

FK必须包含整个引用的PK。不能将外键与主键的一半相加……不能保证仅基于其中一个字段唯一标识父行。这一逻辑应该是显而易见的,当然?我还应该补充一点,不清楚为什么在FacultyDim中有一个复合键……如果你已经有了FacultyKey作为一个自动增量,那么它应该总是唯一的。为什么你也需要FacultyID??这没有多大意义。@jarlh早期这样的构造工作得很好,也许现在是因为FacultyDim有2个主键?据我所知,这种结构是对的?约束组dimu fk0外键(FacultyID)引用FacultyDim(FacultyID)@Adyson它用于使用POWERBI进行数据分析