首页 > 数据库 ># 关于mysql触发器

# 关于mysql触发器

时间:2024-05-30 16:46:31浏览次数:23  
标签:customer 触发器 INT product 关于 mysql id quantity

  1 # 触发器
  2 # 一种MySQL数据库对象,它在表的某些事件发生时自动执行预定义的SQL语句
  3 #触发器类型
  4 # 行级触发器:在每一行受到影响时触发。
  5 # 语句级触发器:在整个语句完成后触发(MySQL目前只支持行级触发器)。
  6 # 触发器的事件
  7 # BEFORE INSERT:在一条记录插入之前触发。
  8 # AFTER INSERT:在一条记录插入之后触发。
  9 # BEFORE UPDATE:在一条记录更新之前触发。
 10 # AFTER UPDATE:在一条记录更新之后触发。
 11 # BEFORE DELETE:在一条记录删除之前触发。
 12 # AFTER DELETE:在一条记录删除之后触发。
 13 # 触发器的作用
 14 # 数据验证:在插入或更新数据时进行验证。
 15 # 自动更新:在特定操作后自动更新某些字段。
 16 # 日志记录:记录数据变化,进行审计。
 17 # 复杂业务逻辑:实现一些复杂的业务逻辑。
 18 #  语法格式
 19 # CREATE TRIGGER trigger_name
 20 # {BEFORE | AFTER} {INSERT | UPDATE | DELETE}
 21 # ON table_name FOR EACH ROW
 22 # BEGIN
 23 #     -- SQL语句
 24 # END;
 25 # 题目
 26 # 1.创建一个触发器:在插入 orders 表的一行数据时,自动更新 products 表的库存数量
 27     use test2;
 28 CREATE TABLE products (
 29     product_id INT PRIMARY KEY,
 30     name VARCHAR(100),
 31     stock_quantity INT
 32 );
 33 
 34 CREATE TABLE orders (
 35     order_id INT PRIMARY KEY,
 36     product_id INT,
 37     quantity INT,
 38     FOREIGN KEY (product_id) REFERENCES products(product_id)
 39 );
 40 create trigger after_insert_orders
 41     after insert on  orders for each row
 42     begin
 43         update products
 44         set stock_quantity = stock_quantity - NEW.quantity
 45         where product_id =NEW.product_id;
 46     end;
 47 # 2.创建一个触发器,在更新 products 表时,如果 stock_quantity 变为负数,则拒绝更新。
 48 CREATE TABLE products (
 49     product_id INT PRIMARY KEY,
 50     product_name VARCHAR(100),
 51     stock_quantity INT
 52 );
 53 create trigger  before_update_products
 54 before update on products
 55     for each row
 56     begin
 57         if NEW.stock_quantity < 0 then
 58 #             触发一个SQL错误。45000是通用错误代码,用于表示自定义的应用程序错误。
 59             signal sqlstate '45000'
 60 #                 设置错误消息文本为“库存数量不能为负”。当错误触发时,数据库将返回这个消息。
 61             set message_text ='库存数量不能为负';
 62         end if;
 63     end;
 64 # 3.创建一个触发器,在删除 customers 表中的记录时,将删除的记录存入 deleted_customers 表中。
 65 CREATE TABLE customers (
 66     customer_id INT PRIMARY KEY,
 67     customer_name VARCHAR(100)
 68 );
 69 
 70 CREATE TABLE deleted_customers (
 71     customer_id INT,
 72     customer_name VARCHAR(100),
 73     deleted_at DATETIME
 74 );
 75 create trigger  after_delete_customers
 76     after  delete  on customers
 77     for each row
 78     begin
 79         insert into deleted_customers(customer_id, customer_name, deleted_at)
 80            value (OLD.customer_id,OLD.customer_name,now());
 81     end;
 82 #4.创建一个触发器,在插入 sales 表时,如果 quantity 小于等于 0,则拒绝插入。
 83 CREATE TABLE sales (
 84     sale_id INT PRIMARY KEY AUTO_INCREMENT,
 85     product_id INT,
 86     quantity INT,
 87     sale_date DATETIME
 88 );
 89 create trigger before_insert_sales
 90     before insert on sales
 91     for each row
 92     begin
 93         if NEW.quantity <= 0 then
 94             signal  sqlstate '45000'
 95             set message_text ='数量必须大于零';
 96         end if;
 97     end;
 98 # 5.创建一个触发器,在更新 employees2 表时,自动更新 last_updated 字段为当前时间。
 99 CREATE TABLE employees2 (
100     employee_id INT PRIMARY KEY AUTO_INCREMENT,
101     employee_name VARCHAR(100),
102     position VARCHAR(100),
103     last_updated DATETIME
104 );
105 create trigger before_update_employees
106     before update on employees2
107     for each row
108     begin
109         set new.last_updated = now();
110     end;

 

标签:customer,触发器,INT,product,关于,mysql,id,quantity
From: https://www.cnblogs.com/Gaze/p/18222659

相关文章

  • 关于PHP的webshell免杀小结
    0X00普通的一句话木马(适用于CTF和小站)<?phpeval($_POST['a']);?>//函数的相似替换<?phpassert($_POST['a']);?> <?php@eval($_POST['110']);?>与第一个一句话木马相比多了一个"@"字符,我们发现这个字符的含义是在php语法中表示抑制错误信息即使有错误也不返回;属于不......
  • Mysql-Xtrabackup备份恢复
    恢复准备1、安装Xtrabackup2、数据备份和拷贝 恢复步骤1、恢复全量备份2、恢复增量备份到全量备份注意:开始恢复的增量备份要添加--redo-only参数,最后一次增量备份去掉--redo-only参数3、对整体的完全备份进行恢复:停库——恢复——启动库恢复场景 全量备份恢复nohupin......
  • 19.基于SSM的点餐系统|基于SSM框架+JSP+ Mysql+Java+B/S框架设计与实现(可运行源码+数
    内容概要:全套项目源码+详尽文档,一站式解决您的学习与项目需求。适用人群:计算机、通信、人工智能、自动化等专业的学生、老师及从业者。使用场景及目标:无论是毕设、期末大作业还是课程设计,一键下载,轻松部署,助您轻松完成项目。项目代码经过调试测试,确保直接运行,节省您的时......
  • 关于工厂方法和抽象工厂
    简单工厂简单工厂中没有抽象工厂类,在仅有的简单工厂中,创建工作根据传入的需求,采用相应的分支,创建相应的对象。说白了就是ifelse,然后newProductX/Y/Z…工厂方法工厂方法中,抽象工厂定义了一个抽象方法,具体工厂实现了该抽象方法,并在实现中创建一种对象。具体创建哪种对象取决于......
  • 为 MySQL/MariaDB 开启 Binlog 功能
    介绍说到Binlog就不得不提一下MySQLServer的四种类型的日志:ErrorLog、GeneralQueryLog、SlowQueryLog和BinaryLog。ErrorLog即错误日志,记录mysqld发生的一些错误。GeneralQueryLog即一般查询日志,记录mysqld正在做的事情,如客户端的连接和断开、来自客......
  • 关于github的全方位使用和与个人小组项目结合
    一,引言今天给大家介绍的是一款源代码管理工具网站Github,Github是一个基于版本控制软件Git打造的网站对于个人而言,Github提供了丰富的代码托管和版本控制功能,方便开发者管理自己的项目和代码,个人也可以在网站上搜索自己所需要的开源项目或者代码片段,同时也可以在网站上向朋友或......
  • 关于洛谷获得数据怪谈
    免责声明:本文仅用于测试键盘性能,输入内容概不负责。在洛谷有时输入数据仅有几个数字,但是出于某些原因无法获得输入数据,但是手贱非常想要获得,于是尝试一种特殊方法。示例题目:P1014[NOIP1999普及组]Cantor表尝试提交以下代码:#include<iostream>usingnamespacestd;intn......
  • 关于前端上传excell时间的问题
    当前端导入excell里的数据时,只能获取到下面类似的这种数据Excel存储的日期是从1900年1月1日开始按天数来计算的,也就是说1900年1月1日在Excel中是1。转化的思路和对Excel中的错误的处理因为时间戳是从1970年1月1日算起的(时间戳为0的时候是1970年1月1日)也就是说newDate(0).toLo......
  • 关于二分
    第一种二分查找1)lower_bound函数,查找相同区间的第一个数的下标intlower_bound(vector<int>&nums,inttarget){ intl=0,r=nums.size()-1,mid; while(l<=r)//区间不为空 { mid=l+(r-l)/2;//防止溢出 if(nums[mid]<target)l=mid+1;//[mid+1,right],把小于目标的......
  • Navicat远程连接阿里云mysql失败,提示2013,2003错误解决方案
    前情提要总结下使用过的各种解决方式,如修改cnf,修改安全组端口,修改防火墙,总有一款方案适合你(如果使用其他方式解决请评论补充,感谢)环境:本文全部使用yum方式安装服务,使用阿里云服务器centos7下文需要格外注意手动配置端口的部分确认已安装好mysql服务(yum安装)......