mysql 触发器创建

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 触发器创建相关的知识,希望对你有一定的参考价值。

我要创建一个触发器目的是增加加班信息,自动修改考勤统计信息,
加班表
create table overtime(
emp_id varchar(8) not null,
ot_year smallint not null,
ot_month tinyint not null,
ot_date tinyint not null,
ot_hours tinyint,
ot_reason varchar(200),
primary key (emp_id,ot_year,ot_month,ot_date),
check(ot_month between 1 and 12),
check(ot_date between 1 and 31),
foreign key (emp_id) references employees(emp_id)
);
考勤信息表
create table attend(
emp_id varchar(8) not null primary key,
att_year smallint,
att_month tinyint,
atttimes tinyint default 0,
latetimes tinyint default 0,
leatimes tinyint default 0,
trutimes tinyint default 0,
vactimes tinyint default 0,
overhours tinyint default 0,
tridays tinyint default 0,
check(att_month between 1 and 12),
foreign key (emp_id) references employees(emp_id)
);

参考技术A 希望你自己写 ,做2个触发器,
第一个触发后可以做对overtime插入操作,这里你没说触发类型????
Create Trigger '增加加班信息'

On overtime --在overtime表中创建触发器
for ????? ----触发的事件
As --事件触发后所要做的事情
begin
insert INTO overtime(你要加的信息)
end
第二个 基于overtime 表的触发update类的 更新加班信息

Create Trigger '修改考勤信息表'
On overtime --在overtime表中创建触发器
for insert --触发的事件
As --事件触发后所要做的事情
if Update(某字段)
begin

Update attend
set 你做overtime的插入后 attend 应该的变化
From attend ,Inserted i --Inserted临时表
Where attend.emp_id =i.emp_id
end
做完之后 你插入几次检测下数据,再写上报错和其它

为啥 MySQL 在创建触发器时会出现此错误?

【中文标题】为啥 MySQL 在创建触发器时会出现此错误?【英文标题】:Why MySQL is giving this error while creating trigger?为什么 MySQL 在创建触发器时会出现此错误? 【发布时间】:2012-11-19 22:08:05 【问题描述】:

我已创建此触发器用于自动生成 SDA0001、SDA0002 等用户代码... 我刚刚包含了 BEGIN 和 END 之间的主要语句。它是在表 agent_mst

上创建 BEFORE INSERT
DECLARE max_id INT;

SET max_id=(SELECT MAX(agent_id_pk)+1 FROM `agent_mst`);
IF (max_id IS NULL) THEN
    SET max_id=1;
END IF;

SET 
NEW.date_added=NOW(), 
NEW.date_updated=NOW(),
NEW.agent_code = CONCAT('SDA', LPAD(max_id, 4,'0'));

它给出的错误如下

MySQL 说:#1064 - 你的 SQL 语法有错误;检查 与您的 MySQL 服务器版本相对应的手册 'DECLARE max_id INT; 附近使用的语法; SET max_id=(选择 MAX(agent_id_pk)+1 FROM agent_mst); ' 在第 1 行

我正在使用 phpMyAdmin 创建这个触发器。

有什么建议吗? 提前致谢。

【问题讨论】:

【参考方案1】:

这应该可行:

DELIMITER $$

CREATE TRIGGER trigger_name BEFORE INSERT ON `agent_mst`
FOR EACH ROW 
BEGIN
    DECLARE max_id INT;

    SET max_id=(SELECT MAX(agent_id_pk)+1 FROM `agent_mst`);
    IF (max_id IS NULL) THEN
        SET max_id=1;
    END IF;

    SET NEW.date_added=NOW(),
        NEW.date_updated=NOW(),
        NEW.agent_code = CONCAT('SDA', LPAD(max_id, 4,'0'));

END $$

DELIMITER ;

【讨论】:

不。仍然是同样的错误。我正在使用 phpMyAdmin 创建触发器。这会造成什么麻烦吗? @aslamdoctor - 不知道。尝试了命令行或工作台。 是的,它从命令行工作。得学点新东西。每当从 phpmyadmin 创建触发器时,始终包含 BEGIN 和 END 语句,即使它自动包含这些语句。 @aslamdoctor - 我更喜欢在工作台上摆弄。然后我把 SQL 放到一个脚本中,只用命令行来做这件事。甚至创建一个脚本来创建数据库等。【参考方案2】:

在所有 pl/sql 函数的 mySQL 中,我们应该首先设置分隔符。因为它会将所有分号作为行尾。

【讨论】:

以上是关于mysql 触发器创建的主要内容,如果未能解决你的问题,请参考以下文章

怎么在Dbeaver中创建mysql 触发器

MySQL如何创建每天0点自动运行的触发器?

MySQL如何创建每天0点自动运行的触发器?

Mysql:创建触发器添加两列值

MySQL数据库 如果触发器不存在 创建

MySQL - 在第 1 行附近创建触发器错误 1064