【问题标题】:Can't create table "Foreign Key constraint is incorrectly formed" SQL无法创建表“外键约束格式错误”SQL
【发布时间】:2023-03-07 03:45:01
【问题描述】:

我是 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 "外键约束格式不正确")

【问题讨论】:

    标签: mysql mysql-workbench


    【解决方案1】:

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

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

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

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

    UNIQUE INDEX IDX_CIF(CIF_Banco)
    

    【讨论】:

      【解决方案2】:

      根据manual

      MySQL 需要外键和引用键的索引,以便 外键检查可以很快而且不需要表扫描。

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

      INDEX IDX_CIF(CIF_Banco)
      

      Working Demo here

      【讨论】:

      • 虽然语法正确,但结果可能无法按预期工作。看我的回答。
      【解决方案3】:

      这是由于 banco 表中的约束。 仔细看看这条线:

      FOREIGN KEY (CIF) REFERENCES Cuenta(CIF_Banco)
      

      您引用的是同一个 CIF。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-02-03
        • 1970-01-01
        • 1970-01-01
        • 2018-02-04
        • 1970-01-01
        • 1970-01-01
        • 2014-01-06
        相关资源
        最近更新 更多