0

我有两张桌子:

表作者:ID (INTEGER)、author_name (VARCHAR)、first_name (VARCHAR)、last_name (VARCHAR)、preferred_name (VARCHAR)。

表 CoAuthored: ID (INTEGER) author1ID (INTEGER), author2ID (INTEGER), paper_ID (INTEGER) (此链接引用的合着论文的 ID)

我想添加外键约束,以便 CoAuthored 中的 author1ID 和 author2ID 引用 Author 中的 ID。我这样定义表:

CREATE TABLE Author(ID INT, author_name VARCHAR(100), preferred_name VARCHAR(100), first_name VARCHAR(100), last_name VARCHAR(100), PRIMARY KEY(ID)) ENGINE=INNODB;

CREATE TABLE CoAuthored(ID INT, author1ID INT, author2ID INT, paper_ID INT);

这是我创建外键的尝试:

ALTER TABLE CoAuthored ADD foreign key (author1ID) references Author(ID) on delete cascade on update cascade;

这执行得很好,但是当我尝试添加一个包含 ID 中不存在的 author1ID 的元组时,它允许我这样做,这意味着外键约束不起作用。

我需要做些什么不同的事情?我尝试在创建语句中创建两个表 ENGINE=INNODB,但随后我会得到一个 ERROR 1005 can't create table。

4

3 回答 3

0

来自:https ://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-6035435.html

为了在两个 MySQL 表之间建立外键关系,必须满足三个条件:

  1. 两个表都必须是 InnoDB 表类型。

  2. 外键关系中使用的字段必须被索引。

  3. 外键关系中使用的字段的数据类型必须相似。

重要提示:对于非 InnoDB 表,忽略 FOREIGN KEY 子句。

于 2010-10-25T20:51:49.607 回答
0

你能试试'ENGINE=InnoDB'吗

外键约束/键约束仅适用于 InnoDB 表:)

- 干杯

于 2010-10-25T20:52:21.017 回答
0

首先:您需要将所有涉及外键的表定义为 InnoDB。MyISAM 根本不支持外键。

您的问题(错误 1005)有点令人困惑。如果您执行ALTER TABLE,则表示其中一个外键字段中有一个值在另一个表中没有引用。

创建表时,请确保首先创建“父”表,然后是第二个和第三个表。

于 2010-10-25T20:53:02.453 回答