数据库中的触发器与存储过程

本文介绍了如何在MySQL中使用触发器和存储过程来确保数据一致性,如插入员工表时检查主键唯一性,工资表操作时自动计算应发工资,以及在插入请假信息时自动关联审核人。示例代码展示了如何创建表、存储过程和触发器以实现这些功能。
摘要由CSDN通过智能技术生成

        触发器和存储过程可以用于实现数据一致性和完整性约束。通过在数据库操作(如插入、更新、删除)发生时自动执行相关逻辑,可以确保数据的正确性,减少错误和数据异常。

         本篇将以如下表为例,创建触发器与存储过程。(Navicat为例)

1.创建表

CREATE DATABASE staff;
USE staff;
CREATE TABLE employee(
    id INT NOT NULL AUTO_INCREMENT,
    userName VARCHAR(255),
    birthDate DATE,
    idCard VARCHAR(255),
    loginName VARCHAR(255),
    PASSWORD VARCHAR(255),
    mobile VARCHAR(255),
    email VARCHAR(255),
    deptId INT,
    LEVEL INT,
    avatar BLOB,
    remark TEXT,
    PRIMARY KEY(id)
);

CREATE TABLE dept(
    id INT NOT NULL AUTO_INCREMENT,
    deptName VARCHAR(255),
    manageId INT,
    remark VARCHAR(255),
    PRIMARY KEY(id)
);

CREATE TABLE payroll(
    id INT NOT NULL AUTO_INCREMENT,
    empId INT,
    baseSalary DOUBLE,
    actualSalary DOUBLE,
    bonus DOUBLE,
    deductMoney DOUBLE,
    grantDate DATE,
    PRIMARY KEY(id)
);

CREATE TABLE ask_leave(
    id INT NOT NULL AUTO_INCREMENT,
    empId INT,
    leaveReason TEXT,
    beginDate DATE,
    endDate DATE,
    submitDate DATE,
    auditId INT,
    STATUS INT,
    auditOpinion TEXT,
    PRIMARY KEY(id)
);

2.编写存储过程实现插入员工表:参数为:

员工编号id  int
姓名userNamevarchar(225)
出生日期birthDatedate
身份证号idCardvarchar(225)
登录名称loginNamevarchar(225)
登录密码passwordvarchar(225)
手机号mobilevarchar(225)
电子邮件emailvarchar(225)
部门编号deptIdint
员工级别levelint
员工头像avatarblob
备注remarktext

存储过程名称为:XXname  ( 存储过程只有输入参数,没有返回值 )

CREATE DEFINER=`root`@`localhost` PROCEDURE XXname(
    IN `id` int,
    IN `username` varchar(225),
    IN `birthDate` date,
    IN `idCard` varchar(225),
    IN `loginName` varchar(225),
    IN `password` varchar(225),
    IN `mobile` varchar(225),
    IN `email` varchar(225),
    IN `deptId` int,
    IN `level` int,
    IN `avatar` blob,
    IN `remark` text
)
BEGIN
    DECLARE cnt INT;
    SELECT COUNT(*) INTO cnt FROM employee WHERE employee.id = id;
    IF cnt = 0 THEN 
        INSERT INTO employee(`id`,`username`,`birthDate`,`idCard`,`loginName`,`password`,`mobile`,`email`,`deptId`,`level`,`avatar`,`remark` )
    VALUES(`id`,`username`,`birthDate`,`idCard`,`loginName`,`password`,`mobile`,`email`,`deptId`,`level`,`avatar`,`remark`);
    END IF;
END

 cnt是为了确保插入的主键值,在表中不存在

3.利用存储过程在表中插入记录.

call insert_employee(1,'小红','2002-03-14','411423200203141510',
'xiaohong','123','15238790678','1625376859@qq.com',3,1,NULL,'新员工');

call insert_employee(2,'小橙','2002-02-14','411423200203241511',
'xiaocheng','123','15238790677','1625376858@qq.com',2,2,NULL,'新员工');

日期类型:YYYY-MM-DD
事件类型:HH : MM : SS 

 4.创建触发器,当插入或修改工资表payroll时,应发工资自动为“基本工资+奖金-缺勤扣钱”。


插入

CREATE TRIGGER `insert_payroll` BEFORE 
INSERT ON `payroll` 
FOR EACH ROW SET new.actualSalary = new.baseSalary + new.bonus - new.deductMoney;

 插入的时候利用触发器根本更改将要插入的内容

更新

CREATE DEFINER = `root`@`localhost`
TRIGGER `update_payroll` BEFORE 
UPDATE ON `payroll` 
FOR EACH ROW SET new.actualSalary = new.baseSalary + new.bonus - new.deductMoney;

 更新的同时可以更改同一行的数据。

5.在员工表中依据姓名XXX建立索引。索引名为:XXindex。

CREATE INDEX XXindex 
ON employee(XXX);

6.建立员工部门工资视图(包含员工名称,部门名称,基本工资,应发工资,奖金,缺勤扣钱)视图名称:XXname。

CREATE VIEW XXname AS
SELECT username AS 姓名,deptName AS 部门名称,baseSalary AS 基本工资,actualSalary AS 应发工资,bonus AS 奖金,deductMoney AS 缺勤扣钱
FROM employee,dept,payroll
WHERE employee.id = payroll.empId AND employee.deptId = dept.id;

7.利用触发器实现插入请假信息时,审核人编号自动填入请假人所在部门的部门经理编号。触发器名称为:XXname。

CREATE DEFINER = `root`@`localhost` 
TRIGGER XXname BEFORE 
INSERT ON `ask_leave` 
FOR EACH ROW SET new.auditId = (
SELECT manageId 
FROM employee,dept 
WHERE employee.deptid = dept.id AND new.empid = employee.id
);

 触发器可以更改插入的内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只大黄猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值