繁体   English   中英

无法创建表“外键约束格式不正确” SQL

[英]Can't create table “Foreign Key constraint is incorrectly formed” SQL

我是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无法创建表practicaer banco (错误号:150“外键约束banco不正确”)

根据手册

MySQL需要在外键和引用键上建立索引,以便外键检查可以快速进行,而无需进行表扫描。

因此,为了能够创建外键,您必须将此行添加到表CuentaCREATE TABLE语句中:

INDEX IDX_CIF(CIF_Banco)

在这里工作演示

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

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

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

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

UNIQUE INDEX IDX_CIF(CIF_Banco)

这是由于banco表中的限制。 仔细看这行:

FOREIGN KEY (CIF) REFERENCES Cuenta(CIF_Banco)

您引用的是相同的CIF。

请注意,所有外键约束必须始终由所有PK列组成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM