错误代码:1215。无法添加外键约束

时间:2016-01-25 05:03:12

标签: mysql sql sql-server

我试图为健身房创建一个软件,但我收到了这个错误而且我不知道为什么,我已经尝试了几个小时而没有什么

  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;

3 个答案:

答案 0 :(得分:2)

这将让你超越最初的障碍。虽然我怀疑你真的想要一个价格的FK,但我不知道翻译成你的母语。

引用的表中需要索引以查找在FK中查找的列。

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创建失败时,通常(几乎总是)必须重新启动引用的引用表。

答案 1 :(得分:1)

您的前两个表格应如下所示,表示参考字段应编入索引。

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;

答案 2 :(得分:0)

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

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