使用两个外键作为主键 - MySQL

14

我对MySQL非常陌生(不得不为大学学习它)。 我需要为一个任务创建数据库和Web界面。

在其中一张表上,我有两列,都是外键,并且我需要将它们同时用作主键。

这是目前的代码:

drop database if exists testJoke;
create database testJoke;
use testJoke;

CREATE TABLE Author
(
  id           int(11)   NOT NULL ,
  name         varchar(255) NULL ,
  cust_email   varchar(255) NULL,
  password char(32) null,

  PRIMARY KEY (id)


);


**CREATE TABLE AuthorRole
(
  authorid  int(11) NOT NULL ,
  roleid varchar(255) NOT NULL,
  PRIMARY KEY (authorid, roleid),
  FOREIGN KEY(authorid) REFERENCES Author(id),
  FOREIGN KEY(roleid) REFERENCES Role(id)

);**



CREATE TABLE Category
(
  id  int(11)      NOT NULL ,
  name varchar(255) NULL,
  PRIMARY KEY (id)
);


CREATE TABLE Joke
(
  id    int(11)      NOT NULL ,
  joketext   text    NULL ,
  jokedate    date   NOT NULL ,
  authorid int(11)   NULL,
  PRIMARY KEY (id),
  FOREIGN KEY(authorid) REFERENCES Author(id)

);


CREATE TABLE JokeCategory
(
  jokeid    int(11)      NOT NULL ,
  categoryid    int(11)  NOT NULL ,
  PRIMARY KEY (jokeid, categoryid),
  FOREIGN KEY(jokeid) REFERENCES Joke(id),
  FOREIGN KEY(categoryid) REFERENCES Category(id)**


);

CREATE TABLE Role
(
  id    varchar(255)      NOT NULL ,
  description  varchar(255)  NULL ,
  PRIMARY KEY (id)
);

所有的表格语法都遵循提供的数据字典。

当我在mysql命令行中运行它时,会在上面加粗的部分("AuthorRole"表)出现错误,显示"无法添加外键约束"。

我已经尝试过调试,似乎问题出在:

FOREIGN KEY(roleid) REFERENCES Role(id)

如果我删除引起问题的外键,一切都将正常工作,如果我保留它并删除其他外键,它会产生错误。

如果有人能够解释一下我的错误之处,我将非常感激。

我已经尝试了谷歌搜索,但没有找到任何有用的资料(可能是因为我使用了错误的关键词)。

谢谢

祝好 Corey

3个回答

7

首先创建“角色”表,然后创建“作者角色”表,就可以了。

CREATE TABLE Role
(
  id    varchar(255)      NOT NULL ,
  description  varchar(255)  NULL ,
  PRIMARY KEY (id)
);

CREATE TABLE AuthorRole
(
  authorid  int(11) NOT NULL ,
  roleid varchar(255) NOT NULL,
  PRIMARY KEY (authorid, roleid),
  FOREIGN KEY(authorid) REFERENCES Author(id),
  FOREIGN KEY(roleid) REFERENCES Role(id)
);

在创建主键时,最好使用 id INT(11) NOT NULL AUTO_INCREMENT

。它能够自动分配唯一的标识符,并且可以确保表中每个记录都有一个唯一的ID。


嗨,成功了!非常感谢你的帮助。我会尝试你说的关于主键的方法。再次感谢。祝好,Corey - Fishingfon

3

问题在于你引用了表的主键,但是在引用时该主键未被创建。请尝试以下sql脚本:

drop database if exists testJoke;
create database testJoke;
use testJoke;

CREATE TABLE Author
(
   id           int(11)   NOT NULL ,
   name         varchar(255) NULL ,
   cust_email   varchar(255) NULL,
   password char(32) null,

   PRIMARY KEY (id)


);

CREATE TABLE Role
(
   id    varchar(255)      NOT NULL ,
   description  varchar(255)  NULL ,
   PRIMARY KEY (id)
);


CREATE TABLE AuthorRole
(
   authorid  int(11) NOT NULL ,
   roleid varchar(255) NOT NULL,
   PRIMARY KEY (authorid, roleid),
   FOREIGN KEY(authorid) REFERENCES Author(id),
   FOREIGN KEY(roleid) REFERENCES Role(id)

);



CREATE TABLE Category
(
  id  int(11)      NOT NULL ,
  name varchar(255) NULL,
  PRIMARY KEY (id)
);


CREATE TABLE Joke
(
  id    int(11)      NOT NULL ,
  joketext   text    NULL ,
  jokedate    date   NOT NULL ,
  authorid int(11)   NULL,
  PRIMARY KEY (id),
  FOREIGN KEY(authorid) REFERENCES Author(id)

);


CREATE TABLE JokeCategory
(
  jokeid    int(11)      NOT NULL ,
  categoryid    int(11)  NOT NULL ,
  PRIMARY KEY (jokeid, categoryid),
  FOREIGN KEY(jokeid) REFERENCES Joke(id),
  FOREIGN KEY(categoryid) REFERENCES Category(id)


);

先创建角色表(Role),然后创建作者角色表(AuthorRole)。


这个脚本应该能够完美运行... 希望这能帮到你。 - Rohan Shah

0
尝试更改
  roleid varchar(255) NOT NULL,

to

  roleid int(11) NOT NULL,

由于字段和关键字段的类型不同


嗨,我尝试按照你说的做了,但是我仍然得到相同的错误。我在“Role”和“AuthorRole”表中都将其更改为类型“int(11)”。谢谢,Corey - Fishingfon
其他人已经回答了你的问题,我错过了一个事实,那就是你创建表的顺序是错误的。 - Bartłomiej Wach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接