【问题标题】:Error Code: 1215. Cannot add foreign key constraint错误代码:1215。无法添加外键约束
【发布时间】:2016-05-01 08:11:40
【问题描述】:

我正在尝试为健身房创建一个软件,但我遇到了这个错误,我不知道为什么,我尝试了几个小时但没有任何结果

  CREATE TABLE Socios (
    IdSocio INT NOT NULL AUTO_INCREMENT,
    Nombre VARCHAR(30) NOT NULL,
    Apellido VARCHAR(30) NOT NULL,
    N_Celular VARCHAR(12),
    Correo VARCHAR(60),
    Fecha_Nacimiento DATE NOT NULL,
    Fecha_Asociacion DATE NOT NULL,
    Fecha_Modificacion DATE NOT NULL,
    Notas VARCHAR(100),
    PRIMARY KEY (IdSocio)
)  ENGINE=INNODB; 

CREATE TABLE tipos(
  IdTipos INT NOT NULL AUTO_INCREMENT,
  Tipo VARCHAR (30) NOT NULL,
  Precio DECIMAL(6,2) NOT NULL,
  PRIMARY KEY (IdTipos)
) ENGINE = INNODB;

CREATE TABLE productos (
IdProducto INT NOT NULL AUTO_INCREMENT,
Producto VARCHAR (40) NOT NULL,
Descripcion VARCHAR (100),
Costo_Individual DECIMAL(6,2) NOT NULL,
Precio_venta DECIMAL(6,2) NOT NULL,
Estado BOOL NOT NULL,
Cantidad_Inicial INT NOT NULL,
Cantidad_actual INT NOT NULL,
PRIMARY KEY(IdProducto)
) ENGINE = INNODB;

错误代码:1215。无法添加外键约束 我收到此表的此错误

CREATE TABLE membresia(
IdMembresia INT NOT NULL AUTO_INCREMENT, 
Nombre VARCHAR(30) NOT NULL,
Tipo VARCHAR(30) NOT NULL,
Fecha_Inicio DATE NOT NULL,
Fecha_Vencimiento DATE NOT NULL, 
Inscripcion BOOL NOT NULL,
Estado_membresia VARCHAR(15) NOT NULL,
Fecha_modificacion DATE NOT NULL,
Total DECIMAL(6,2) NOT NULL,
Nota VARCHAR(100), 
Fecha_Nota DATE, 
PRIMARY KEY (IdMembresia),
CONSTRAINT IdSocio FOREIGN KEY (Nombre)
      REFERENCES Socios (Nombre),
CONSTRAINT IdTipos FOREIGN KEY (Tipo,Total)
  REFERENCES tipos (Tipo,Precio)
) ENGINE = INNODB;


CREATE TABLE ventas (
IdVenta INT NOT NULL AUTO_INCREMENT,
Producto VARCHAR (40) NOT NULL,
Fecha_venta DATE NOT NULL,
cantidad INT NOT NULL,
Total DECIMAL(8,2),
Fecha_Modificacion DATE NOT NULL,
Nota VARCHAR (100),
PRIMARY KEY (IdVenta),
CONSTRAINT IdProducto FOREIGN KEY (Producto) 
    REFERENCES productos(Producto)
) ENGINE = INNODB;

【问题讨论】:

  • FOREIGN KEY 已成为表的主键。在您的代码列中没有主键..
  • 在哪一栏?他们都有主键@MukeshKalgude
  • 您在这里使用的是 MySQL 还是 MS SQL Server?不要标记未涉及的产品...

标签: mysql sql sql-server


【解决方案1】:

这将使您克服最初的障碍。虽然我怀疑你是否真的想要一个 FK 的价格,但我不知道翻译成你的母语。

对于在 FK 中查找的列,您需要在 referenced 表上建立索引。

create schema dbtest_xyz;
use dbtest_xyz;

 -- drop table Socios;
  CREATE TABLE Socios (
    IdSocio INT NOT NULL AUTO_INCREMENT,
    Nombre VARCHAR(30) NOT NULL,
    Apellido VARCHAR(30) NOT NULL,
    N_Celular VARCHAR(12),
    Correo VARCHAR(60),
    Fecha_Nacimiento DATE NOT NULL,
    Fecha_Asociacion DATE NOT NULL,
    Fecha_Modificacion DATE NOT NULL,
    Notas VARCHAR(100),
    PRIMARY KEY (IdSocio),
    key(Nombre) -- ADDED *******************************
)  ENGINE=INNODB; 

-- drop table tipos;
CREATE TABLE tipos(
  IdTipos INT NOT NULL AUTO_INCREMENT,
  Tipo VARCHAR (30) NOT NULL,
  Precio DECIMAL(6,2) NOT NULL,
  PRIMARY KEY (IdTipos),
  key(Tipo),    -- ADDED *******************************
  key(Precio)   -- ADDED *******************************
) ENGINE = INNODB;

-- drop table productos;
CREATE TABLE productos (
IdProducto INT NOT NULL AUTO_INCREMENT,
Producto VARCHAR (40) NOT NULL,
Descripcion VARCHAR (100),
Costo_Individual DECIMAL(6,2) NOT NULL,
Precio_venta DECIMAL(6,2) NOT NULL,
Estado BOOL NOT NULL,
Cantidad_Inicial INT NOT NULL,
Cantidad_actual INT NOT NULL,
PRIMARY KEY(IdProducto),
key(Producto) -- ADDED *******************************
) ENGINE = INNODB;


CREATE TABLE membresia(
IdMembresia INT NOT NULL AUTO_INCREMENT, 
Nombre VARCHAR(30) NOT NULL,
Tipo VARCHAR(30) NOT NULL,
Fecha_Inicio DATE NOT NULL,
Fecha_Vencimiento DATE NOT NULL, 
Inscripcion BOOL NOT NULL,
Estado_membresia VARCHAR(15) NOT NULL,
Fecha_modificacion DATE NOT NULL,
Total DECIMAL(6,2) NOT NULL,
Nota VARCHAR(100), 
Fecha_Nota DATE, 
PRIMARY KEY (IdMembresia),
CONSTRAINT IdSocio FOREIGN KEY (Nombre)
      REFERENCES Socios (Nombre),
CONSTRAINT IdTipos FOREIGN KEY (Tipo)
      REFERENCES tipos (Tipo),
CONSTRAINT IdMembresia FOREIGN KEY (Total)
      REFERENCES tipos (Precio)
) ENGINE = INNODB;


CREATE TABLE ventas (
IdVenta INT NOT NULL AUTO_INCREMENT,
Producto VARCHAR (40) NOT NULL,
Fecha_venta DATE NOT NULL,
cantidad INT NOT NULL,
Total DECIMAL(8,2),
Fecha_Modificacion DATE NOT NULL,
Nota VARCHAR (100),
PRIMARY KEY (IdVenta),
CONSTRAINT IdProducto FOREIGN KEY (Producto) 
    REFERENCES productos(Producto)
) ENGINE = INNODB;

-- Cleanup:
drop schema dbtest_xyz;

Foreign Keys上的Mysql手册页

MySQL 需要外键和引用键的索引,以便 外键检查可以很快并且不需要表扫描。在里面 引用表,必须有外键所在的索引 列按相同顺序列为第一列。这样一个 如果没有,则在引用表上自动创建索引 存在。如果您创建,此索引可能会在稍后被静默删除 另一个可用于强制外键约束的索引。 index_name,如果给定,则如前所述使用。

注意,我在某些表格上方有drop tables 的原因是,在反复尝试创建时将它们放在适当的位置是明智的。当 FK 创建失败时,通常(几乎总是)必须重新调整 referencedreferencing 表。

【讨论】:

  • 非常感谢,这是我使用 MySQL 的第一天,这对我帮助很大,我不知道所有这些事情。
  • 对不起,我在成员表中仍然有错误:/
  • 对,因为您的旧表处于某种时髦状态。细节和到位以及顺序......很重要。
【解决方案2】:

您的前 2 个表应如下所示,表示应为引用的字段编制索引。

CREATE TABLE Socios (
    IdSocio INT NOT NULL AUTO_INCREMENT,
    Nombre VARCHAR(30) NOT NULL,
    Apellido VARCHAR(30) NOT NULL,
    N_Celular VARCHAR(12),
    Correo VARCHAR(60),
    Fecha_Nacimiento DATE NOT NULL,
    Fecha_Asociacion DATE NOT NULL,
    Fecha_Modificacion DATE NOT NULL,
    Notas VARCHAR(100),
    KEY idx_Nombre(Nombre),
    PRIMARY KEY (IdSocio)
)  ENGINE=INNODB; 

CREATE TABLE tipos(
  IdTipos INT NOT NULL AUTO_INCREMENT,
  Tipo VARCHAR (30) NOT NULL,
  Precio DECIMAL(6,2) NOT NULL,
  KEY idx_tipo_precio(Tipo,Precio),
  PRIMARY KEY (IdTipos)
) ENGINE = INNODB;

【讨论】:

  • Precio 在合成中不起作用,因为它不是最左边的。手册页指定了这一点,而且如果您对其进行测试,它将无法工作。
  • @Drew:我检查过了,它工作正常。如果您遇到任何问题,请详细说明,如果您可以提供任何相关链接,将会有所帮助。
  • KEY idx_tipo_precio(Tipo,Precio) 使用非最左侧的 Precio 生成复合键
  • 所以当 CREATE TABLE membresia( .... 出现时,它会失败,因为它的 3 个 FK 中只有 2 个在引用的表中具有可用的最左侧索引
  • 请检查 sql fiddle sqlfiddle.com/#!9/d66b9 如果您执行以下语句“INSERT INTO membresia VALUES(1,'abc',10.00,CURDATE());”那么很好,但如果你插入任何破坏外键规则的行,那么将不允许插入。这意味着它工作正常......此外,这不是争论,但我想测试它并需要你的帮助。 :)
【解决方案3】:

万一有一天这可能对其他人有所帮助,我遇到了这个问题,但现有的解决方案都没有帮助 - 列的类型相同,排序规则相同,等等。

但是,我在表中存储了一个生成的列,其中包含引用该键列的外键,并且由于某种原因,这破坏了外键生成。删除生成的列并使用触发器来修复它。

【讨论】:

    猜你喜欢
    • 2016-10-27
    • 2018-11-10
    • 2013-07-15
    • 2018-05-13
    • 2015-05-27
    • 2017-09-18
    相关资源
    最近更新 更多