8.6. MySQL 高级编程
持之以恒,方得始终!
存储引擎
myisam
支持全文搜索
不是事务安全的
不支持外键
memory
表存储在内存中
表的索引是hash
性能高
innodb
事务安全
支持外键
比 myisam 表慢
事务
将一组 sql 作为一个整体,要么全部执行,要么全部不执行。
比如,a用户向b用户转账,a的钱减少,b增加,这两个操作应该是一起的,看作一个原子操作。
我们看下事务需要满足的特性:
- 原子性,就是作为一个整体。
- 一致性
- 隔离性,事务之间是隔离的。
- 持续性,一旦事务成功,就是永久写入。
一个事务被永久的写入数据库,即表示该事务被提交了。
没有写入的事务,则被回滚。
默认下,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