我在mysql workbench上的新东西,我尝试了很多东西让我的脚本工作但我只是不能......我有这些表:
CREATE TABLE Utilizador (email varchar(40) not null, nome varchar(50)
not null, dataNascimento date, profissao varchar(50) not null,
reputacao double(3,2) unsigned not null, constraint pk_Utilizador
primary key(email))
这是第一个创建的表格!
CREATE TABLE POI (email varchar(40) not null, designacaoPOI
varchar(10) not null, coordenadaX int, coordenadaY int,
descricaoPOI varchar(200), constraint pk_POI primary key(email,
designacaoPOI), constraint fk_POI foreign key(email) references
Utilizador(email) on delete cascade)
这是第二个创建的表格!
CREATE TABLE Utilizador_POI (email varchar(40) not null, designacaoPOI
varchar(10) not null, constraint pk_Utilizador_POI primary key(email,
designacaoPOI), constraint fk1_Utilizador_POI foreign key(email)
references Utilizador(email) on delete cascade, constraint
fk2_Utilizador_POI foreign key(designacaoPOI) references
POI(designacaoPOI) on delete cascade)
此表给出了错误:错误代码:1215。无法添加外键约束
我做了一些测试,我几乎可以确定问题出在外键“designacaoPOI”中。另一个FK(“电子邮件”)不给我任何错误,所以问题可能在表POI中?
先谢谢!
答案 0 :(得分:1)
我认为问题在于Utilizador_POI.email
引用POI.email
,本身引用Utilizador.email
。 MySQL可能对双链接感到不安。
此外,由于Utilizador
和POI
之间似乎存在多对多的关系,我认为Utilizador_POI
的结构并不是您真正想要的。相反,Utilizador_POI
应引用Utilizador
中的主键和POI
中匹配的主键。
答案 1 :(得分:1)
这里的问题有两个:
1 / ID
使用PRIMARY KEY
s
您应该将ID
用于主键而不是VARCHAR
s或任何具有任何真实世界“商业含义”的内容。如果您希望email
在Utilizador
表中唯一,则email
和designacaoPOI
的组合在POI
表中是唯一的,并且相同组合(email
和designacaoPOI
)在Utilizador_POI
中是唯一的,您应该使用UNIQUE KEY
约束而不是PRIMARY KEY
约束。
2 / DELETE CASCADE
上的FOREIGN KEY
PRIMARY KEY
不能引用Utilizador_POI
在第三个表FOREIGN KEY
中,您有两个POI
个引用PRIMARY KEY
。不幸的是,POI
DELETE CASCADE
是一个复合键,因此MySQL不知道如何处理FOREIGN KEY
,因为{{1}之间没有一对一的关系在Utilizador_POI
和PRIMARY KEY
的{{1}}。{/ p>
如果您将所有表格更改为POI
PRIMARY KEY
,则如下所示:
ID
然后,您可以CREATE TABLE blah (
id INT(9) AUTO_INCREMENT NOT NULL
....
PRIMARY KEY (id)
);
引用每个表格,ID
和FOREIGN KEY
都可以使用。
答案 2 :(得分:0)
问题出在你的第二张桌子上。您的主键是(email,designacaoPOI),当您尝试在表中引用它时,它会因此而导致错误:
InnoDB允许外键引用任何索引列或组 列。但是,在引用的表中,必须有一个索引 其中引用的列被列为的第一列 同样的顺序。
要使其正常工作,请更改第二个故事PRIMARY KEY的顺序:
CREATE TABLE POI (
email VARCHAR(40) NOT NULL,
designacaoPOI VARCHAR(10) NOT NULL,
coordenadaX INT,
coordenadaY INT,
descricaoPOI VARCHAR(200),
CONSTRAINT pk_POI PRIMARY KEY (designacaoPOI,email), -- changed the order
CONSTRAINT fk_POI FOREIGN KEY (email)
REFERENCES Utilizador(email) ON DELETE CASCADE
);
或为designacaoPOI添加索引:
CREATE TABLE POI (
email VARCHAR(40) NOT NULL,
designacaoPOI VARCHAR(10) NOT NULL,
coordenadaX INT,
coordenadaY INT,
descricaoPOI VARCHAR(200),
CONSTRAINT pk_POI PRIMARY KEY (designacaoPOI,email),
KEY key_designacaoPOI(designacaoPOI), -- added index for that column
CONSTRAINT fk_POI FOREIGN KEY (email)
REFERENCES Utilizador(email) ON DELETE CASCADE
);
这些解决方案都可以让您创建第三个表而不会出错。