MySQL外键协助

MySQL外键协助,mysql,database,syntax,foreign-keys,Mysql,Database,Syntax,Foreign Keys,我正在处理数据库分配,遇到了此错误 数据库应该看起来像 Legend: **Primary Key** *Foreign Key 我的代码看起来像这样 CREATE TABLE Movies ( title varchar(50), year int, length int, genre varchar(50), studioName varchar(50), producerID varchar(50), PRIMARY KEY (title,year) FOREIGN KEY (stud

我正在处理数据库分配,遇到了此错误

数据库应该看起来像

Legend: **Primary Key** *Foreign Key

我的代码看起来像这样

CREATE TABLE Movies (
title varchar(50),
year int,
length int,
genre varchar(50),
studioName varchar(50),
producerID varchar(50),
PRIMARY KEY (title,year)
FOREIGN KEY (studioName) REFERENCES Studio(name),
FOREIGN KEY (producerID) REFERENCES MovieMaker(ID),
);

CREATE TABLE StarsIn (
movieTitle varchar(50),
movieYear int,
starName varchar(50),
PRIMARY KEY (movieTitle,movieYear,starName),
FOREIGN KEY (movieTitle) REFERENCES Movies(title),
FOREIGN KEY (movieYear) REFERENCES Movies(year),
FOREIGN KEY (starName) REFERENCES MovieStar(name)
);

CREATE TABLE MovieStar (
name varchar(50),
birthdate int,
address varchar(50),
gender varchar(50),
PRIMARY KEY (name)
);

CREATE TABLE MovieMaker (
ID varchar(50),
name varchar(50),
address varchar(50),
PRIMARY KEY (ID)
);

CREATE TABLE Studio (
name varchar(50),
address varchar(50),
presidentID varchar(50),
PRIMARY KEY (name),
FOREIGN KEY (presidentID) REFERENCES MovieMaker(ID)
);

然而,我得到了相当多的错误,指出我的外键语法是关闭的。有人能伸出援助之手吗?

通过外键引用其他表的表只能在引用的表已经存在后定义。因此,必须对表进行重新排序,以便首先创建在
外键
约束中引用的表

此外,引用
Movies.year
Movies.title
的外键将失败,因为您没有在这些列上单独定义索引。您确实将它们作为复合的
主键
,但它们需要自己的索引

/* MovieStar, MovieMaker are referenced by other tables
   but have no FKs of their own, so create them first */
CREATE TABLE MovieStar (
  name varchar(50),
  birthdate int,
  address varchar(50),
  gender varchar(50),
  PRIMARY KEY (name)
);

CREATE TABLE MovieMaker (
  ID varchar(50),
  name varchar(50),
  address varchar(50),
  PRIMARY KEY (ID)
);

/* Studio can be created next, referencing only MovieMaker */
CREATE TABLE Studio (
  name varchar(50),
  address varchar(50),
  presidentID varchar(50),
  PRIMARY KEY (name),
  FOREIGN KEY (presidentID) REFERENCES MovieMaker(ID)
);

/* Movies references 2 of the above */
CREATE TABLE Movies (
  title varchar(50),
  year int,
  length int,
  genre varchar(50),
  studioName varchar(50),
  producerID varchar(50),
  /* A comma was missing here... */
  PRIMARY KEY (title,year),
  FOREIGN KEY (studioName) REFERENCES Studio(name),
  FOREIGN KEY (producerID) REFERENCES MovieMaker(ID),
  /* Add individual indices on Movies. Omitting this would result in errno 150 */
  INDEX (year),
  INDEX (title)
);

CREATE TABLE StarsIn (
  movieTitle varchar(50),
  movieYear int,
  starName varchar(50),
  PRIMARY KEY (movieTitle,movieYear,starName),
  FOREIGN KEY (movieTitle) REFERENCES Movies(title),
  FOREIGN KEY (movieYear) REFERENCES Movies(year),
  FOREIGN KEY (starName) REFERENCES MovieStar(name)
);

这里是正确构建整个过程的演示:

通过外键引用其他表的表只能在引用的表已经存在后定义。因此,必须对表进行重新排序,以便首先创建在
外键
约束中引用的表

此外,引用
Movies.year
Movies.title
的外键将失败,因为您没有在这些列上单独定义索引。您确实将它们作为复合的
主键
,但它们需要自己的索引

/* MovieStar, MovieMaker are referenced by other tables
   but have no FKs of their own, so create them first */
CREATE TABLE MovieStar (
  name varchar(50),
  birthdate int,
  address varchar(50),
  gender varchar(50),
  PRIMARY KEY (name)
);

CREATE TABLE MovieMaker (
  ID varchar(50),
  name varchar(50),
  address varchar(50),
  PRIMARY KEY (ID)
);

/* Studio can be created next, referencing only MovieMaker */
CREATE TABLE Studio (
  name varchar(50),
  address varchar(50),
  presidentID varchar(50),
  PRIMARY KEY (name),
  FOREIGN KEY (presidentID) REFERENCES MovieMaker(ID)
);

/* Movies references 2 of the above */
CREATE TABLE Movies (
  title varchar(50),
  year int,
  length int,
  genre varchar(50),
  studioName varchar(50),
  producerID varchar(50),
  /* A comma was missing here... */
  PRIMARY KEY (title,year),
  FOREIGN KEY (studioName) REFERENCES Studio(name),
  FOREIGN KEY (producerID) REFERENCES MovieMaker(ID),
  /* Add individual indices on Movies. Omitting this would result in errno 150 */
  INDEX (year),
  INDEX (title)
);

CREATE TABLE StarsIn (
  movieTitle varchar(50),
  movieYear int,
  starName varchar(50),
  PRIMARY KEY (movieTitle,movieYear,starName),
  FOREIGN KEY (movieTitle) REFERENCES Movies(title),
  FOREIGN KEY (movieYear) REFERENCES Movies(year),
  FOREIGN KEY (starName) REFERENCES MovieStar(name)
);

这里是整个正确构建过程的演示:

错误消息是?错误信息是?您可以只声明
外键(movieTitle,movieYear)引用Movies(title,year)
,这可能更适合这种情况。@MichealBerkowski这非常有效!我从来不知道在MySQL中,订单是一件大事。谢谢!您可以只声明
外键(movieTitle,movieYear)引用Movies(title,year)
,这可能更适合这种情况。@MichealBerkowski这非常有效!我从来不知道在MySQL中,订单是一件大事。谢谢!