我有两张桌子:
表作者: ID(INTEGER), author_name(VARCHAR), first_name(VARCHAR), last_name(VARCHAR), preferred_name(VARCHAR)。
表格共同作者: ID(整数) 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的元组时,它允许我这样做,这意味着外键约束不起作用。
我需要做些什么不同的事情?我尝试在create语句中创建两个表ENGINE = INNODB,但后来我得到一个ERROR 1005无法创建表。
答案 0 :(得分:0)
来自:https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-6035435.html
为了在两个MySQL表之间建立外键关系,必须满足三个条件:
两个表必须是InnoDB表类型。
必须将外键关系中使用的字段编入索引。
外键关系中使用的字段在数据类型中必须相似。
重要说明:对于非InnoDB表,将忽略FOREIGN KEY子句。
答案 1 :(得分:0)
你能试试'ENGINE = InnoDB'
吗?外键约束/键约束仅适用于InnoDB表:)
- 干杯
答案 2 :(得分:0)
首先:您需要将涉及外键的所有表定义为InnoDB。 MyISAM根本不支持外键。
你的问题(错误1005)有点令人困惑。如果你执行ALTER TABLE
,则意味着其中一个外键字段中有一个值在另一个表中没有引用。
创建表时,请确保首先创建“父”表,然后创建第二个和第三个表。