我正在创建一个小型数据库,这样我就可以掌握MySQL和SQL。
我不确定我做错了什么,但我想我会发布我的代码,以防问题是语法上的问题,我只是没有抓到。
CREATE TABLE student(
ID varchar(5) NOT NULL,
name varchar(20) NOT NULL,
dept_name varchar(20),
tot_cred numeric(3,0),
PRIMARY KEY(ID),
FOREIGN KEY(dept_name)
REFERENCES department
ON UPDATE CASCADE
ON DELETE CASCADE)
ENGINE = InnoDB;
我已经创建了包含dept_name主键的'department'表。我在使用外键约束时尝试继续使用ENGINE = InnoDB,但显然不成功。
有人可以向我解释为什么MySQL会给我一个错误1005 errno 150以及我应该如何使用最简单的术语修复它?
答案 0 :(得分:1)
来自mysql docs:
1005 (ER_CANT_CREATE_TABLE)
Cannot create table. If the error message refers to error 150, table creation failed because a foreign key constraint was not correctly formed. If the error message refers to error –1, table creation probably failed because the table includes a column name that matched the name of an internal InnoDB table.
使用REFERENCES
时,您应该同时指定引用表和表中的引用行:
示例:
REFERENCES部门(id)
此外,出于性能原因,建议使用数值作为外键。
答案 1 :(得分:1)
确保您遵守此语法...
CREATE TABLE parent (
id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE child (
id INT,
parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id)
REFERENCES parent(id)
ON DELETE CASCADE
) ENGINE=INNODB;
确保您的数据类型在fk上相同...并且您必须说明其中的哪个列在另一个表中引用
答案 2 :(得分:0)
我刚遇到这个问题。我的解决方案是确保我引用的字段的整数类型都是 UNSIGNED 。如果一个签名而另一个签名,则会收到此错误。
如果你想要负数,那么只要确保两者都是签名,但很可能你会想要UNSIGNED。要点是它们必须是同一类型。
因此,如果您在另一个表中引用主键,请确保主键是UNSIGNED整数类型。
然后,当您创建外键时,请确保您创建它的列也是UNSIGNED Integer类型。