【问题标题】:Error 2014 MySQL. Commands out of sync, when i create my first trigger错误 2014 MySQL。命令不同步,当我创建我的第一个触发器时
【发布时间】:2021-10-25 09:07:33
【问题描述】:

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

我把你放在上下文中:我创建了 2 个表,'Empleados'(员工)和 'Empresas'(公司),关系为 N:N,这创建了另一个表,即这些实体之间的关系,即 'TRABAJAN '(工作),在那里,我已经在公司中输入了开始日期(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 //

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

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

【问题讨论】:

  • IF TRABAJAN(Trabajando) = 0 ??? TRABAJAN 是函数吗?
  • 不,它是一个表,但他的 Trabajando 列具有布尔值
  • 请仔细查看查询中如何指定表的列。

标签: mysql database triggers


【解决方案1】:

作为一种避免触发的替代方法;考虑使用计算/派生列: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_finNULL 时,Trabajando 的值设置为true (b'1')。

Fecha_finNOT 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
;

【讨论】:

  • 我必须如何在该列中插入值?它返回错误 3105,不允许为表 'trabajan' 中生成的列 'Trabajando' 指定的值
  • 嗨@AbelPérez,您不需要在此设置中插入Trabajando 列。它的值自动从Fecha_fin 中的值派生而来。
  • 你能看到我对这篇文章的新回答吗?非常感谢
  • 我试图插入这样的数据:INSERT INTO TRABAJAN(codEmpleado,codEmpresa,Fecha_inicio,Fecha_fin) VALUES (001,004,'2017/02/19','2019/07/23') ;但它给了我这个错误:错误代码:1366。不正确的整数值:'\ x00' for column 'Working' at row 1
  • 嗨@AbelPérez - 我建议您阅读我的答案中链接的文档。您不能在生成的列中插入值。
猜你喜欢
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 2011-05-03
  • 2020-07-02
  • 2020-09-06
相关资源
最近更新 更多