mysql - 错误 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 //
为什么我会收到这个错误?我需要修改什么?最后一个查询是触发器设计得好不好?
非常感谢大家的帮助和时间,问候
解决方案
作为避免触发的替代方法;考虑使用计算/派生列: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
;