MySQL#1005无法创建表,但没有说明原因,错误:150

时间:2012-11-17 23:10:19

标签: mysql sql create-table

我正在创建一个包含多个表的数据库,到目前为止我可以创建表,并使用一些演示数据更新它,但是当我试图创建一个用于连接我的两个表的新表时,我得到了这个无论我做什么都无法创建表错误。试图将实体重命名为完全不同的名称,这可能就是问题,但事实并非如此。

CREATE DATABASE IF NOT EXISTS ETR;

CREATE TABLE Hallgato (
OktAzonosito INT(6) PRIMARY KEY,
EHAazonosito VARCHAR(11),
TeljesNev VARCHAR(50),
Szemelyazonosito INT(6),
AnyaNyelv VARCHAR(20),
VegzettsegSzint VARCHAR(25),
AnyjaNeve VARCHAR(35),
SzuletesiHely VARCHAR(30),
SzuletesiEv DATE,
Allampolgarsag VARCHAR(30),
Neme VARCHAR(5),
Adoazonosito INT(6),
TAJszam INT(6),
BankszamlaSzam INT(9)
) ENGINE = InnoDB;

CREATE TABLE OktAdat (
OktAzonosito INT(6),
NyelvVizsgaNyelve VARCHAR(15),
NyVegzesDatuma DATE,
NyIntezmeny VARCHAR(35),
EgyebVegzetteseg VARCHAR(15),
EgyVegzesDatuma DATE,
ID INT(5) PRIMARY KEY NOT NULL auto_increment,
FOREIGN KEY (OktAzonosito) REFERENCES Hallgato(OktAzonosito) ON DELETE CASCADE
) ENGINE = InnoDB;

CREATE TABLE Oktato (
TEHAazonosito VARCHAR(11) PRIMARY KEY,
Nev VARCHAR(50),
SzuletesiEv DATE,
Szakterulet VARCHAR(25),
Telefonszam INT(9),
Email VARCHAR(50)
) ENGINE = InnoDB;

CREATE TABLE Kurzus (
KurzusKod VARCHAR(8) PRIMARY KEY,
KurzusNev VARCHAR(30),
Idotartam INT(3),
EloadasHelye VARCHAR(25),
Tipus CHAR(3),
Vizsgatipus VARCHAR(7),
KreditErtek INT(2),
OktatoKod VARCHAR(11)
) ENGINE = InnoDB;

CREATE TABLE Terem (
Sorszam INT(3) PRIMARY KEY NOT NULL,
Epuletszam INT(1),
Kapacitas INT(3),
IRszam INT(4),
Utca CHAR(25),
Hazszam INT(2)
) ENGINE = InnoDB;

CREATE TABLE DiakKurz (
kd_id INT (5) PRIMARY KEY NOT NULL auto_increment,
DKKod VARCHAR(8),
EHA VARCHAR(11),
FOREIGN KEY (EHA) REFERENCES Hallgato(EHAazonosito) ON DELETE CASCADE,
FOREIGN KEY (DKKod) REFERENCES Kurzus(KurzusKod) ON DELETE CASCADE
) ENGINE = InnoDB;

问题在于创建DiakKurz表。

4 个答案:

答案 0 :(得分:1)

这个

FOREIGN KEY (EHA) REFERENCES Hallgato(EHAazonosito) ON DELETE CASCADE,

不起作用,因为EHAazonosito不是Hallgato表的主键。外键只能引用主键(或唯一键)。

Btw:您是否对6中的int(6) 关于限制列中的值感到不满?

它没有做任何事情。 int(6)int相同。 6仅用于向客户端应用程序提供一个提示(!),其中应显示列的位数。它根本不执行任何操作。

答案 1 :(得分:1)

您必须在表Hallgato

中为列EHAazonosito设置INDEX
CREATE TABLE Hallgato (
OktAzonosito INT(6) PRIMARY KEY,
EHAazonosito VARCHAR(11), INDEX (EHAazonosito),
TeljesNev VARCHAR(50),
Szemelyazonosito INT(6),
AnyaNyelv VARCHAR(20),
VegzettsegSzint VARCHAR(25),
AnyjaNeve VARCHAR(35),
SzuletesiHely VARCHAR(30),
SzuletesiEv DATE,
Allampolgarsag VARCHAR(30),
Neme VARCHAR(5),
Adoazonosito INT(6),
TAJszam INT(6),
BankszamlaSzam INT(9)
) ENGINE = InnoDB;

答案 2 :(得分:0)

您是否尝试过查找错误?

  

如果MySQL从CREATE TABLE语句报告错误号1005,   并且错误消息引用错误150,表创建失败   因为没有正确形成外键约束。同样的,   如果ALTER TABLE失败并且它引用错误150,则表示a   对于更改的内容,将错误地形成外键定义   表。显示最新的InnoDB的详细说明   服务器中的外键错误,发出SHOW ENGINE INNODB STATUS。

http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

答案 3 :(得分:0)

在整个架构的转储之后,它也发生在我身上,这有助于将整个转储包装在禁用的外键检查中

SET foreign_key_checks=0;

...dump

SET foreign_key_checks=1;