Ошибка # 1215 - Невозможно добавить ограничение внешнего ключа ON DELETE SET NULL - PullRequest
0 голосов
/ 27 ноября 2018

Я пытался пару часов добавить этот запрос со ссылочной целостностью, но он указывает на ошибку, но если я их уберу, запрос будет работать нормально.Я ставлю их только на таблицы лотов и операторов.

CREATE DATABASE alamilla;
USE alamilla;


CREATE TABLE cat_niveles(
    id INT(11) AUTO_INCREMENT,
    nombre VARCHAR(255),
    PRIMARY KEY (id) 
)ENGINE=INNODB;

INSERT INTO cat_niveles VALUES(NULL, 'ADMINISTRADOR');
INSERT INTO cat_niveles VALUES(NULL, 'VENTA');
INSERT INTO cat_niveles VALUES(NULL, 'ALTA');


CREATE TABLE categorias_medicamentos(
    id INT(11) AUTO_INCREMENT,
    nombre VARCHAR(255),
    PRIMARY KEY(id)
)ENGINE=INNODB;

CREATE TABLE corte_cajas(
    id INT(11) AUTO_INCREMENT,
    fecha_corte DATETIME,
    PRIMARY KEY(id)
)ENGINE=INNODB;

CREATE TABLE proveedores(
    id INT(11) AUTO_INCREMENT,
    nombre VARCHAR(255) NOT NULL,
    apellidos VARCHAR(255) NOT NULL,
    compania VARCHAR(100) NOT NULL,
    direccion VARCHAR(100) NULL,
    telefono1  VARCHAR(100) NULL,
    telefono2 VARCHAR(100) NULL,
    fecha_alta DATETIME DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY(id)
)ENGINE=INNODB;

CREATE TABLE medicamentos(
    cve_medicamento  VARCHAR(255) NOT NULL,
    nombre_generico  VARCHAR(255) NOT NULL,
    nombre_comercial VARCHAR(255) NULL,
    descripcion      VARCHAR(255) NULL,
    imagen           VARCHAR(255) NULL,
    presentacion     VARCHAR(255) NULL,
    precio_adquisitivo DECIMAL(15,2) NOT NULL,
    precio_venta DECIMAL(15,2) NOT NULL,
    unidades_caja INT(11) NOT NULL,
    stock_minimo INT(11) NOT NULL,
    fecha_alta DATETIME DEFAULT CURRENT_TIMESTAMP,
    id_proveedor INT(11) NULL,
    id_categoria INT(11) NULL,
    PRIMARY KEY(cve_medicamento),
    FOREIGN KEY(id_proveedor) REFERENCES proveedores(id)

)ENGINE=INNODB;

CREATE TABLE tipo_operaciones(  
    id INT(11) AUTO_INCREMENT,
    nombre VARCHAR(255) NOT NULL,
     PRIMARY KEY(id)
)ENGINE=INNODB;

CREATE TABLE lotes(
    cve_lote VARCHAR(255) NOT NULL,
    fecha_alta DATETIME DEFAULT CURRENT_TIMESTAMP,
    fecha_caducidad DATE,
    cve_medicamento  VARCHAR(255) NOT NULL,
    PRIMARY KEY(cve_lote),
    FOREIGN KEY(cve_medicamento) REFERENCES medicamentos(cve_medicamento) ON DELETE SET NULL ON UPDATE CASCADE
)ENGINE=INNODB;


CREATE TABLE pedidos(
    id INT(11) AUTO_INCREMENT,
    dinero DECIMAL(15, 2) NULL,
    total DECIMAL(15,2) NULL,
    descuento DECIMAL(15, 2) NULL,
    fecha     DATETIME NULL,
    id_tipo_operacion INT(11) NULL,
    id_proveedor INT(11) NULL,
    id_corte_caja      INT(11) NULL,
    id_usuario   INT(11) NULL,
     PRIMARY KEY(id),
    FOREIGN KEY(id_tipo_operacion) REFERENCES tipo_operaciones(id),
    FOREIGN KEY(id_proveedor) REFERENCES proveedores(id),
    FOREIGN KEY(id_corte_caja) REFERENCES corte_cajas(id)
)ENGINE=INNODB;


CREATE TABLE operaciones(
    id INT(11) AUTO_INCREMENT,
    cantidad INT(11) NULL,
    descuento DECIMAL(15,2) NULL,
    precio DECIMAL(15,2) NULL,
    id_tipo_operacion INT(11) NULL,
    id_medicamento   VARCHAR(255) NULL,
    id_pedido      INT(11) NULL,
    cve_lote       VARCHAR(255) NULL,
    PRIMARY KEY(id),
    FOREIGN KEY(id_tipo_operacion) REFERENCES tipo_operaciones(id),
    FOREIGN KEY(id_medicamento) REFERENCES medicamentos(cve_medicamento) ON DELETE SET NULL ON UPDATE CASCADE,
    FOREIGN KEY(id_pedido) REFERENCES pedidos(id),
    FOREIGN KEY(cve_lote) REFERENCES lotes(cve_lote) ON DELETE SET NULL ON UPDATE CASCADE
)ENGINE=INNODB;

CREATE TABLE usuarios(
    id INT(11) AUTO_INCREMENT,
    nick VARCHAR(100) NOT NULL,
    pass VARCHAR(255) NOT NULL,
    nombre VARCHAR(100) NOT NULL,
    apellidos VARCHAR(100) NOT NULL,
    bloque TINYINT(2) NOT NULL,
    foto VARCHAR(255),
    id_nivel INT(11) NOT NULL,
    PRIMARY KEY(id),
    FOREIGN KEY(id_nivel) REFERENCES cat_niveles(id)
)ENGINE=INNODB;

INSERT INTO usuarios VALUES(NULL, 'admin','d033e22ae348aeb5660fc2140aec35850c4da997','ALBERTO','ALAMILLA MURILLO', 1, 'foto_perfil/ADMINISTRADOR.png', 1);

INSERT INTO `categorias_medicamentos` (`id`, `nombre`) VALUES
(null, 'BAÑOS'),
(null, 'COLUTORIOS'),
(null, 'COMPRIMIDOS'),
(null, 'ELIXIRES'),
(null, 'GOTAS'),
(null, 'GOTAS NASALES'),
(null, 'INHALADORES'),
(null, 'JARABE'),
(null, 'LOCIONES'),
(null, 'MEDICAMENTO DE PRUEBA'),
(null, 'NEBULIZACIONES'),
(null, 'PARCHES TRANDERMICOS'),
(null, 'POLVOS'),
(null, 'POMADAS RECTALES'),
(null, 'SELLOS'),
(null, 'SUPOSITORIOS'),
(null, 'SUSPENSION'),
(null, 'TABLETAS');

Я всегда получаю ошибку # 1215 не могу добавить ограничение внешнего ключа. Рука не будет плохой идеей, спасибо.PS: у меня уже болит голова, потому что я не нашел проблему

1 Ответ

0 голосов
/ 27 ноября 2018

Существует противоречие в вашем операторе CREATE для таблицы lotes.

CREATE TABLE lotes(
    cve_lote VARCHAR(255) NOT NULL,
    fecha_alta DATETIME DEFAULT CURRENT_TIMESTAMP,
    fecha_caducidad DATE,
    cve_medicamento  VARCHAR(255) NOT NULL,
    PRIMARY KEY(cve_lote),
    FOREIGN KEY(cve_medicamento) REFERENCES medicamentos(cve_medicamento) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=INNODB;

Проблема заключается здесь:

cve_medicamento  VARCHAR(255) NOT NULL

Издесь:

FOREIGN KEY(cve_medicamento) ... ON DELETE SET NULL

В первой строке вы явно указали, что cve_medicamento не должно быть NULL.Во второй строке вы явно указали, что cve_medicamento должен быть установлен в NULL при удалении ссылки на внешний ключ.

Мне удалось получить запрос науспешно создайте таблицу lotes, исключив NOT NULL и изменив строку на

cve_medicamento  VARCHAR(255)

Подробнее о документации MySQL ... .

Если вы указали действие SET NULL, убедитесь, что вы не объявили столбцы в дочерней таблице как NOT NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...