热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

mysql事务语句顺序_一篇文章,总结MySQL基本操作

原创文章&经验总结&从校招到A厂一路阳光一路沧桑imageMySQL的基本操作可以包括两个方面:MySQL常用语句如高频率使用的增删改查(CRUD)语句和MySQL高

原创文章&经验总结&从校招到A厂一路阳光一路沧桑

执行存储过程

使用CALL子句执行存储过程,CALL子句接受存储过程的名称以及需要传递的参数。

CALL ordertotal(1,TRUE,@total);

SELECT @total;

如果存储过程中定义了OUT类型的输入参数,那么在执行存储过程时需要传入变量,如这里@total,并且变量都是用@开始的。如果存储过程中没有参数的话,就用空圆括号表示即可,CALL ordertotal();

删除存储过程

删除存储过程,可以使用DROP PROCEDURE子句。如DROP PROCEDURE ordertotal;

查询存储过程

显示创建一个存储过程的语句,可以使用SHOW CREATE PROCEDURE。如SHOW CREATE PROCEDURE ordertotal;

查询所有存储过程的状态,如果在定义存储过程中使用COMMENT添加注释,可以查看。同时可以LIKE进行过滤结果。如SHOW PROCEDURE STATUS LIKE '%order%';

6. 事务处理

什么是事务?

事务处理是用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行。事务处理是一种机制,用来管理必须成批执行的MySQL操作,它们要么时作为整体执行或者完全不执行。

关键概念:

事务:是指一组SQL语句;

回退:是指撤销指定的SQL语句的过程;

提交:指将未存储的SQL语句的结果写入数据库表中;

保留点:指事务处理中设置的临时占位符,可以对它发布回退;

如何创建执行事务?

START TRANSACTION;

INSERT INTO customers (cust_name,item_price,item_quantity) VALUES ('1',5,18);

SELECT * FROM customers;

SAVEPOINT insertinto;

INSERT INTO customers (cust_name,item_price,item_quantity) VALUES ('2',5,18);

ROLLBACK TO insertinto;

执行结果为:插入数据('1',5,18)有效,因为,只会从保留点SAFEPOINT之后开始回退,也就是说保留点SAFEPOINT之前的SQL语句执行的结果仍然有效。

有这样一些细节:

STAET TRANSACTION用来表示下面的SQL语句集为一段事务;

SAFEPOINT 用于指定保留点insertinto;

ROLLBACK TO表示从指定保留点开=开始回退,也就是说保留点之前的SQL语句执行结果依然有效。如果仅仅使用ROLLBACK进行回退的话就表示从STAET TRANSACTION之后所有的SQL语句执行效果都会撤销;

MySQL提交(写或保存)操作是自动进行的,这称之为隐含提交。但是在事务处理块中,提交不会隐含进行,要使用COMMIT子句进行提交。如:

START TRANSACTION;

INSERT INTO customers (cust_name,item_price,item_quantity) VALUES ('1',5,18);

INSERT INTO customers (cust_name,item_price,item_quantity) VALUES ('2',5,18);

COMMIT;

采用COMMIT提交事务,如果两条SQL语句都执行成功,才会将数据都写入表中。

7. 触发器

什么是触发器?

当某条SQL语句发生时,自动执行某些其他的SQL语句的时候就需要使用到触发器。触发器只能响应:DELETE,INSERT,UPDATE这三个特定操作。

创建触发器?

创建触发器时需要给出最重要的四条信息:1.全局唯一的触发器名;2.触发器关联的表;3.触发器在何时执行(操作执行之前或者之后)4.触发器应该响应的活动(DELETE, INSERT或者UPDATE);

由于触发器只能响应特定的三种类型的操作,因此可创建的触发器也就三种类型:INSERT触发器,DELETE触发器以及UPDATE触发器。

> **INSERT触发器**

在执行INSERT触发器时,也这样几点需要注意:1.在INSERT触发器代码内,可以引用一个名为NEW的虚拟表,可以用NEW来访问刚插入的行数据;2.在BEFORE INSERT触发器中,NEW中的值可以被更新;3.对于AUTO_INCREMENT列,NEW在INSERT执行之前包含0.在INSERT执行之后包含新的自定生成值。

创建一个INSERT触发器,每次插入一行数据,每次会返回当前插入的行数据的id。

/*创建触发器*/

CREATE TRIGGER insertcustomers AFTER INSERT ON customers

FOR EACH ROW SELECT NEW.cust_id INTO @newinsertid;

/*执行触发器*/

INSERT INTO customers (cust_name,item_price,item_quantity) VALUES ('2',5,18);

SELECT @newinsertid;

有这样一些细节:

1. 使用CREATE TRIGGER来创建触发器;

2. AFTER INSERT表明在插入行数据之后,触发器才会执行特征操作;

3. FOR EACH ROW 表示对插入的每一行数据,触发器都起作用;

4. 针对INSERT触发器,可以使用虚拟表NEW,来使用刚插入的行数据。比如例子中,`SELECT NEW.cust_id INTO @newinsertid`表示将新插入的行数据的id赋值给变量@newinsertid;

> **DELETE触发器**

DELETE触发器在DELETE语句执行之前或者之后,需要知道以下两点:

1. 在DELETE触发器代码内,可以引用一个名为OLD的虚拟表,来访问被删除的行;

2. OLD表中的数据只能读,不能被更新,而在INSERT触发器中,就可以通过NEW来更新被插入的行数据;

例如,针对customers表,当删除一行数据时,返回被删除数据的`cust_id`以及`cust_name`:

/*创建DELETE触发器*/

DELIMITER //

CREATE TRIGGER insertcustomers AFTER DELETE ON customers

FOR EACH ROW

BEGIN

SELECT OLD.cust_name INTO @deletecustname;

SELECT OLD.cust_id INTO @deletecustid;

END //

/*调用DELETE触发器*/

DELETE FROM customers WHERE cust_id = 3;

SELECT @deletecustname;

SELECT @deletecustid;

基本上与创建INSERT触发器一样,只不过在DELETE触发器中只能使用OLD来访问被删除的行数据。

> **UPDATE触发器**

UPDATE触发器在UPDATE语句执行之前或者之后执行,需要知道一下几点:

1. 在BEFORE UPDATE触发器中可以使用NEW和OLD来访问数据,而在AFTER UPDATE触发器中使用NEW来访问数据会报错,只能使用OLD来访问数据;

2. 在BEFORE UPDATE触发器中,NEW中的值可以被改变,即允许更改将用于UPDATE的数据;

3. OLD中的行数据只能读,不能被更新;

一个UPDATE触发器示例如下:

/*创建UPDATE触发器*/

DELIMITER //

CREATE TRIGGER insertcustomers BEFORE UPDATE ON customers

FOR EACH ROW

BEGIN

SELECT NEW.cust_name INTO @beforeupdate;

SET NEW.cust_name = 'reset_name';

SELECT OLD.cust_name INTO @afterupdate;

END //

/*调用UPDATE触发器*/

UPDATE customers SET cust_name = 'happy' WHERE cust_id = 5;

SELECT @beforeupdate;

SELECT @afterupdate;

输出为@beforeupdate为‘happay’,而@afterupdate为'reset_name'。有这样一些细节:

1. NEW虚拟表中的数据可以更改,如这里采用 `SET NEW.cust_name = 'reset_name';`,将待更新的`cust_name由“happy”变成了“reset_name”`;

2. 在BEFORE UPDATE触发器中可以使用NEW和OLD来访问数据,而在AFTER UPDATE触发器中使用NEW来访问数据会报错;

删除触发器?

删除触发器,可以使用 DROP TRIGGER语句,比如DROP TRIGGER insertcustomers;。触发器不能更新或者覆盖,如果要修改触发器,必须删除这个触发器。



推荐阅读
  • 本文详细介绍了如何使用ActionScript 3.0 (AS3) 连接并操作MySQL数据库。通过具体的代码示例和步骤说明,帮助开发者理解并实现这一过程。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 5G至4G空闲态移动TAU流程解析
    本文详细解析了用户从5G网络移动到4G网络时,在空闲态下触发的跟踪区更新(TAU)流程。通过N26接口实现无缝迁移,确保用户体验不受影响。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 本文详细探讨了 MySQL 中自增 ID 的工作原理,特别是在并发写入场景下如何确保 ID 不会重复,并介绍了相关的优化策略和常见问题。 ... [详细]
  • 本文详细介绍了 MySQL 中 LAST_INSERT_ID() 函数的使用方法及其工作原理,包括如何获取最后一个插入记录的自增 ID、多行插入时的行为以及在不同客户端环境下的表现。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 本文探讨了MariaDB在当前数据库市场中的地位和挑战,分析其可能面临的困境,并提出了对未来发展的几点看法。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • 本文将深入探讨PHP编程语言的基本概念,并解释PHP概念股的含义。通过详细解析,帮助读者理解PHP在Web开发和股票市场中的重要性。 ... [详细]
  • 解决网站乱码问题的综合指南
    本文总结了导致网站乱码的常见原因,并提供了详细的解决方案,包括文件编码、HTML元标签设置、服务器响应头配置、数据库字符集调整以及PHP与MySQL交互时的编码处理。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文介绍 PHP 函数 mysql_field_len 的使用方法,该函数用于返回 MySQL 查询结果集中指定字段的长度。适用于 PHP 4 和 PHP 5 版本。 ... [详细]
author-avatar
dgh
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有