首页 > 解决方案 > 错误 2014 MySQL。命令不同步,当我创建我的第一个触发器时

问题描述

我正在创建一个有关应用程序商店的信息数据库,我想冒险创建我的第一个触发器,但是我的语法中的某些内容失败了(我是编程新手)并且终端返回不同步的 2014 错误命令。

我把你放在上下文中:我创建了 2 个表,'Empleados'(employees) 和 'Empresas'(company),关系为 N:N,这创建了这些实体之间关系的另一个表,即 'TRABAJAN'(work ),在那里,我在公司中输入了开始日期 (Fecha_inicio) 和结束日期 (Fecha_fin),此外,我还放置了另一列,其中包含关于它们是否工作的布尔值。当我插入数据时,我允许如果他们继续工作,他们有一个 NULL 值。

好吧,我想要的是创建一个触发器,当将工作列的状态从 1 修改为 0 时,我将 Date_fin 列的 NULL 值修改为当前系统日期的值。

我把代码和我所做的触发尝试留给你:

CREATE DATABASE Info_Tiendas_App2;
USE Info_Tiendas_App2;

CREATE TABLE Empleados (
codEmpleado SMALLINT PRIMARY KEY,
DNI VARCHAR(9) NOT NULL UNIQUE,
NomEmpleado VARCHAR(40) NOT NULL,
Calle VARCHAR(30),
Numero NUMERIC(3,0),
CodPostal NUMERIC(5,0),
CorreoElect VARCHAR(50)
);

CREATE TABLE Empresas (
codEmpresa SMALLINT PRIMARY KEY,
NomEmpresa VARCHAR(50) NOT NULL,
PaisFacturacion VARCHAR(15) NOT NULL,
AnnoCreacion NUMERIC(4,0),
Correo VARCHAR(50),
PagWeb VARCHAR(40)
);

CREATE TABLE TRABAJAN (
codEmpleado SMALLINT,
codEmpresa SMALLINT,
Fecha_inicio DATE,
Fecha_fin DATE,
Trabajando BOOLEAN,
PRIMARY KEY (codEmpleado, codEmpresa), 
FOREIGN KEY (codEmpleado) REFERENCES Empleados(codEmpleado)
ON DELETE CASCADE
ON UPDATE CASCADE,
FOREIGN KEY (codEmpresa) REFERENCES Empresas(codEmpresa)
ON DELETE CASCADE
ON UPDATE CASCADE 
);

-- Aquí el trigger
DROP TRIGGER IF EXISTS Mod_fecha_fin;
CREATE TRIGGER Mod_fecha_fin
AFTER UPDATE 
ON TRABAJAN
FOR EACH ROW
BEGIN
IF TRABAJAN(Trabajando) = 0 
UPDATE INTO TRABAJAN(Fecha_fin) SET Fecha_fin = (NOW())
ELSE
SET Fecha_fin = NULL
END //

为什么我会收到这个错误?我需要修改什么?最后一个查询是触发器设计得好不好?

非常感谢大家的帮助和时间,问候

标签: mysqldatabasetriggers

解决方案


作为避免触发的替代方法;考虑使用计算/派生列:https ://dev.mysql.com/doc/refman/8.0/en/create-table-generated-columns.html

CREATE TABLE TRABAJAN (
   codEmpleado  SMALLINT
 , codEmpresa   SMALLINT
 , Fecha_inicio DATE
 , Fecha_fin    DATE
 , Trabajando   BOOLEAN AS (CASE WHEN Fecha_fin IS NULL THEN b'1' ELSE b'0' END),
);

Fecha_fin为时NULL, 的值Trabajando设置为true( b'1')。

Fecha_fin为时NOT NULL, 的值Trabajando设置为false( b'0')。

即,当设置了结束日期时,它们被认为不起作用。如果没有结束日期,则认为它们正在工作。

然后,您所要做的就是更新Fecha_fin例如的值:

UPDATE TRABAJAN
SET    Fecha_fin = CURRENT_TIMESTAMP
WHERE  codEmpleado = 937
AND    codEmpresa = 123
AND    Fecha_fin IS NULL
;

推荐阅读