8.6. MySQL 高级编程

未匹配的标注

持之以恒,方得始终!

存储引擎

myisam

支持全文搜索
不是事务安全的
不支持外键

memory

表存储在内存中
表的索引是hash
性能高

innodb

事务安全
支持外键
比 myisam 表慢

事务

将一组 sql 作为一个整体,要么全部执行,要么全部不执行。
比如,a用户向b用户转账,a的钱减少,b增加,这两个操作应该是一起的,看作一个原子操作。

我们看下事务需要满足的特性:

  1. 原子性,就是作为一个整体。
  2. 一致性
  3. 隔离性,事务之间是隔离的。
  4. 持续性,一旦事务成功,就是永久写入。

一个事务被永久的写入数据库,即表示该事务被提交了。
没有写入的事务,则被回滚。

默认下,mysql 是自动提交的(autocommit),也就是执行的语句,会立马生效。

关闭自动提交 set autocommit = 0;

开始一个事务 start transaction;

提交一个事务 commit

如果执行失败可以 rollback

修改之前 orders,order_books 表为innodb

alter table orders type = innodb;
alter table order_books type = innodb;

我们先打开两个 mysql客户端,关闭自动提交,
在一个连接中,添加记录

insert into orders values (5, 2, 69.98, '2008-06-18');
insert into order_books values (5, '0-672-31607-8',1);

看下能否查到

select * from orders where orderid = 5;

切到另一个连接,同样查询,看不到该添加的记录。
现在回到第一个连接,执行 commit。另一个连接中应该可以看到结果了。

外键

比如,order_books 表中插入一行,它的 orderid 必须是 orders 表中有效的一行。

创建一个有外键的表

create table order_books (
    orderid int unsigned not null references orders(orderid),
    isbn char(13) not null,
    quantity tinyint unsigned,
    primary key(orderid, isbn)
) type=InnoDB;

我们在 orderid 列后面添加了 references orders(orderid),表示该列是一个外键,其值必须得在 orders 表得 orderid列中。

对已有的表修改

alter table order_books type=InnoDB;
alter table order_books add foreign key(orderid) references orders(orderid);

我们可以来测一下,在 order_books 表插入一行,其 orderid 不在 orders表的 orderid 列值中。

insert into order_books values (77, '0-672-31697-8', 7);

执行后,会报错。

存储过程

delimiter //

create procedure total_orders (out total float)
BEGIN
    select sum(amount) into total from orders;
END
//

delimiter ;

delimiter // 修改提交符 ; ,避免存储过程中的 ; 被当作提交符,直接执行了。
create procedure total_orders (out total float) ,创建存储过程,其名称是 total_orders,out表示 total 参数被返回,该值也可以是 in,表示传入参数给存储过程,或者 inout,表示传入后会被修改,然后返回。 float 是参数的类型。
可以接收多个参数,用, 分割。
begin,end,你可以看作是 php的 {}

into 将结果载入 total 参数。

调用过程

call total_orders(@t)

call 将调用 total_orders 过程,并且传入一个用来保存结果的变量,要查看结果,查看该变量即可

select @t;

函数

和过程差不多,区别是,函数里面一般不会执行 sql 语句。

函数接收输入参数,并且返回一个唯一值。

delimiter //

create function add_tax (price float) returns float
BEGIN
    return price*1.1;
END

//

delimiter ;

调用函数,和调用内置函数一样。

select add_tax(100);

查看定义的过程,函数的代码:

show create procedure total_orders;

show create function add_tax;

也可以删除他们

drop procedure total_orders;

drop function add_tax;

局部变量

使用 declare ,可以在 begi…end 中,声明局部变量

delimiter //

create function add_tax(price float) returns float
begin
    declare tax float default 0.10;
    return price*(1+tax);
end

//

delimiter ;

如有任何侵权行为,请通知我删除,谢谢大家!
个人邮箱:865460609@qq.com

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
Junwind
讨论数量: 0
发起讨论 查看所有版本


暂无话题~