无法创建表"外键约束形成错误" SQL

时间:2016-04-10 15:01:14

标签: mysql mysql-workbench

我是SQL的新手,我的SQL代码有点问题。我一直在搜索这种错误,但我找不到任何适合我的问题的答案。这是代码示例。

CREATE DATABASE IF NOT EXISTS `PracticaER`;
USE `PracticaER`;

DROP TABLE IF EXISTS Banco;
DROP TABLE IF EXISTS Cuenta;
DROP TABLE IF EXISTS Usuario;

CREATE TABLE Usuario (
id_usuario INT NOT NULL AUTO_INCREMENT,
nombre VARCHAR(10) NOT NULL,
DNI VARCHAR(9) NOT NULL UNIQUE,
usuario VARCHAR(10) NOT NULL,
Contrasena VARCHAR(15) NOT NULL,
PRIMARY KEY (id_usuario)
);

CREATE TABLE Cuenta (
CIF_Banco VARCHAR(20) NOT NULL,
num_cuenta INT NOT NULL,
balance FLOAT NOT NULL DEFAULT 0.0,
fecha_apertura VARCHAR(20) NOT NULL,
DNI VARCHAR(9) NOT NULL,
PRIMARY KEY (num_cuenta),
FOREIGN KEY (DNI) REFERENCES Usuario(DNI)
);

CREATE TABLE Banco (
CIF VARCHAR(20) NOT NULL,
nombre VARCHAR(9) NOT NULL,
cod_oficial INT NOT NULL,
pais VARCHAR(15) NOT NULL,
PRIMARY KEY (CIF),
FOREIGN KEY (CIF) REFERENCES Cuenta(CIF_Banco)
);

当我执行MySQL时,这就是错误。基本上它无法创建表格" Banco"。

  

错误代码:1005。无法创建表practicaerbanco(错误号码:150)   "外键约束形成错误")

3 个答案:

答案 0 :(得分:0)

根据manual

  

MySQL要求外键和引用键上的索引   外键检查可以很快,不需要进行表扫描。

因此,为了能够创建外键,您必须将此行添加到表CREATE TABLE的{​​{1}}语句中:

Cuenta

Working Demo here

答案 1 :(得分:0)

您正在尝试引用Cuenta表中不是UNIQUE的列或该表的PRIMARY KEY。 MySQL允许这样做,如果你在该表的列上添加一个索引(如Giorgos Betsos的回答),但建议不要这样做:

  

此外,MySQL要求对引用的列进行索引   出于性能原因。但是,系统不强制执行   要求引用的列为UNIQUE或声明为NOT   空值。处理对非唯一键或键的外键引用   对于诸如的操作,没有很好地定义包含NULL值的值   更新或删除CASCADE。建议您使用外键   仅引用UNIQUE(包括PRIMARY)和NOT NULL键。

使CIF_Banco表的PK成为Cuenta,或使其成为UNIQUE索引,以使CREATE TABLE语句执行,并使约束本身以可预测的方式工作。 / p>

将此行添加到Cuenta表的CREATE语句中:

UNIQUE INDEX IDX_CIF(CIF_Banco)

答案 2 :(得分:-2)

这是因为银行桌的限制。 仔细看看这一行:

FOREIGN KEY (CIF) REFERENCES Cuenta(CIF_Banco)

您正在引用相同的CIF。

请注意,所有外键约束必须始终包含所有PK列。