试图学习Mysql并遇到外键约束是错误的

试图学习Mysql并遇到外键约束是错误的,mysql,sql,database-design,foreign-keys,create-table,Mysql,Sql,Database Design,Foreign Keys,Create Table,由于某种原因,由于外键错误,我的代码不允许我创建projects表。我尝试了一些不同的方法,但似乎无法使其发挥作用,我尝试在这里寻找解决方案,但似乎无法做到这一点。任何帮助都将不胜感激 CREATE TABLE PEOPLE ( NAME VARCHAR(32) NOT NULL, GENDER ENUM('Male', 'Female', 'Other'), DOB DATE NOT NULL, SALARY VARCHAR(16) NOT NULL,

由于某种原因,由于外键错误,我的代码不允许我创建projects表。我尝试了一些不同的方法,但似乎无法使其发挥作用,我尝试在这里寻找解决方案,但似乎无法做到这一点。任何帮助都将不胜感激

CREATE TABLE PEOPLE (
    NAME VARCHAR(32) NOT NULL,
    GENDER ENUM('Male', 'Female', 'Other'),
    DOB DATE NOT NULL,
    SALARY VARCHAR(16) NOT NULL,
    PROJECT VARCHAR(32) NOT NULL,
    BUSINESS_NAME VARCHAR(32) NOT NULL,
    PRIMARY KEY(NAME, PROJECT)
);

CREATE TABLE PEOPLE_EMAILS (
    NAME_ID VARCHAR(32) NOT NULL,
    EMAIL VARCHAR(64) NOT NULL,
    PRIMARY KEY(EMAIL),
    FOREIGN KEY(NAME_ID) REFERENCES PEOPLE(NAME)
);

CREATE TABLE PEOPLE_PHONE (
    NAME_ID2 VARCHAR(32) NOT NULL,
    PHONE_NUMBER VARCHAR(32) NOT NULL,
    PRIMARY KEY (PHONE_NUMBER),
    FOREIGN KEY(NAME_ID2) REFERENCES PEOPLE(NAME)
);

CREATE TABLE PROJECTS (
    PROJECT_NAME VARCHAR(32) NOT NULL,
    PROJECT_LOCATION VARCHAR(32) NOT NULL,
    BUDGET VARCHAR(16) NOT NULL,
    FOREIGN KEY(PROJECT_NAME) REFERENCES PEOPLE(PROJECT)
);

想必,您希望外键与此相反。您可能希望人们引用项目,而不是项目引用人

这意味着您需要先创建projects表,然后创建people表。此外,您需要在项目上有一个适当的主键,以便在人员中引用它(我假设
project\u name


外键(项目名称)引用人员(项目)
-必须在
人员
表中有一个索引,该索引的表达式等于或从
项目
字段开始。现在没有这样的索引。在您的例子中,最简单的解决方案是
createindex idx_project ON people(project)
CREATE TABLE PROJECTS (
    PROJECT_NAME VARCHAR(32) NOT NULL,
    PROJECT_LOCATION VARCHAR(32) NOT NULL,
    BUDGET VARCHAR(16) NOT NULL,
    PRIMARY KEY (PROJECT_NAME)
);

CREATE TABLE PEOPLE (
    NAME VARCHAR(32) NOT NULL,
    GENDER ENUM('Male', 'Female', 'Other'),
    DOB DATE NOT NULL,
    SALARY VARCHAR(16) NOT NULL,
    PROJECT VARCHAR(32) NOT NULL,
    BUSINESS_NAME VARCHAR(32) NOT NULL,
    PRIMARY KEY(NAME, PROJECT),
    FOREIGN KEY(PROJECT) REFERENCES PROJECTS(PROJECT_NAME)
);

CREATE TABLE PEOPLE_EMAILS (
    NAME_ID VARCHAR(32) NOT NULL,
    EMAIL VARCHAR(64) NOT NULL,
    PRIMARY KEY(EMAIL),
    FOREIGN KEY(NAME_ID) REFERENCES PEOPLE(NAME)
);

CREATE TABLE PEOPLE_PHONE (
    NAME_ID2 VARCHAR(32) NOT NULL,
    PHONE_NUMBER VARCHAR(32) NOT NULL,
    PRIMARY KEY (PHONE_NUMBER),
    FOREIGN KEY(NAME_ID2) REFERENCES PEOPLE(NAME)
);