MySql的存储过程

1:什么是存储过程:存储过程是在大型数据库系统中,一组完成特定功能的SQL语句集合,在存储过程中,经过第一次编译后,再次调用不需要再次编译,用户通过指定存储过程的名字并给参数来执行它。存储过程是数据库中一个重要的对象。
数据库存储的基本语法:
DELIMITER //
CREATE DEFINER='root'@'%' PROCEDURE name_of_procedure (IN t_in_param TYPE,
OUT t_out_param TYPE)
BEGIN
declare vret int unsigned default 1000;
...
END
DELIMITER;
解释一下:这里需要注意的是DELIMITER//和DELIMITER;两句,DELIMITER是分割符的意思,因为MySQL默认以”;”为分隔 符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当 前段分隔符,这样MySQL才会将”;”当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。(命令行中使用)
2:触发器是一种特殊的存储过程,他不同于前面介绍的存储过程。触发器主要通过事件进行触发而被执行的,而存储过程可以通过存储过程名字直接调用。当对某一表进行更新,插入,删除等操作时,sql会自动执行触发器所定义的SQL语句,从而保证对数据的处理必须符合SQL语句所定义的规则。触发器的主要作用的就是能够实现由主键和外检所不能保证的复杂参照完整性和数据一致性,另外触发器还有强化约束、跟踪变化、级联运行和存储过程调用的功能。

数据库设计的三大范式:
第一范式:
数据表中的每个字段必须是不可拆分的最小单元(即原子性)
说白一点,就是拆的不能再拆了,例如用户的地址信息:河南郑州金水区柳州路100号,在设计数据库时不能只用一个地段来存储地址,而是拆开来,而且是拆的不能再拆了,比如拆成:省份,县市,街道。注意这里要根据需要进行不可拆分的拆分,如果用户对地址的详细信息要求不那么详细,就没有必要拆分了。
第二范式:
在满足第一范式的基础上,要求表中的所有列都必须依赖于主键,而不能有任何一列与主键没有关系
第三范式:
在满足第二范式的基础上,表中的每一列只与主键直接相关而不是间接相关(表中的每一列只能依赖于主键)。比如用户信息和用户的uid(主键)直接相关。而用户购买商品的订单信息和订单id(主键)直接相关,所以订单的信息不能放在用户表中,另外用户和商品是一对多的情况,多以最好的设即是在订单表中添加一个字段作为外键来保存用户的主键。
相关知识点:
1> CREATE PROCEDURE 'procedure_name'(参数1 类型,参数2 类型,参数3 类型,参数4 类型,参数5 类型)--------创建一个名字为procedure_name的存储过程
2> 存储过程必须是有BEGIN...END包裹
3> declare 变量名 类型 default 数值--------声明一个某类型的变量,默认值是数值
4> DML中没有!=0只能使用<>来表示非0
5> if ... than...end if 要配对使用
6> start transaction; commit; rollback;数据库的回顾操作。来说一下事物的过程:
  6.1> set autocommit = 0 指事物非自动提交,自此句执行以后,每个SQL语句或者语块所在的事务都要显示使用commit命令后才会提交事务。
  6.2> 不管autocommit是0还是1,START TRANSCTION后,commit后才会生效,rollback后才会回滚。
  6.3> autocommit是0时,不管有没有START TRANSCTION,只有commit数据才会生效,roolback后才会回滚。
  6.4> autocommit是1时,并且没有START TRANSACTION时,roolback是没有用的,即便是设置了SAVEPOINT
7> 如果MySQL数据库中有这样的需求:存在记录就更新,没有就插入一条记录。
例如:insert into table_name(devid, firsttime, lasttime, regtimes, firstuid, lastuid, partner)
values (pdeviceid, NOW(), NOW(), 1, puid, puid, ppartner)
on duplicate key update lasttime=NOW(), regtimes=regtimes+1, lastuid=puid;
8> 在存储过程中可以想创建存储过程一样,创建一个函数FUNCTION,在存储过程中可以调用函数的。例如:select f_give_prop(precvuid, ppropid, pcount) into vret。而创建函数的过程与创建存储过程稍有所不同。
9> CREATE FUNCTION 'function_name'(变量 类型,变量1 类型1,变量2 类型2) RETURNS 类型--------创建一个函数过程

posted @ 2018-06-06 16:21  first_semon  阅读(163)  评论(0编辑  收藏  举报