[2015-8-27]
学习内容
学习【PHP和MySQL Web开发】一书 第13章,MySQL高级编程
学习总结
1. 从外部文本文件导入到MySQL数据表
LOAD DATA INFILE "newbooks.txt" INTO TABLE books;
数据字段用tab分隔,所有的char 字符串需要用单引号包起来,数字不用。不同行用换行符分隔,特殊符号用\ 转义
2 . 索引引擎
创建表的时候,可以指定表格类型
CREATE TABLE tablename TYPE= type ...
type 可以为:
MyISAM
Indexed Sequential Access Method, 默认和标准的存储类型,可以被压缩,可以全文检索,但是不是事务安全,也不能支持外键。
MEMORY,(HEAP),存储于内存,哈希分部。
速度快,但是发生崩溃的话会丢数据(因为存于内存中,coredump时就没有了)
需要在CREATE TABLE时指定 MAX_ROW, 否则会占据大量内存,不能有BLOB或者text或者autoincrement 的列
MERGE
能够为了查询的目的,将多个MyISAM表的集合合并为一个表。
ARCHIVE
能够保存大量数据,但是只支持少量注脚,支持INSERT SELECT, 不支持delete update replace和索引。
CSV
一个CSV文件,逗号分隔。方便查看而已。
InnoDB
事务安全,也就是提供commit和rollback的功能。在需要一个事务安全的引擎的时候使用,要比MyISAM慢一点。
一般用的是MyISAM或者InnoDB。
更改数据表的类型
在创建后使用
mysql > alter table orders type = innodb
ACID四原则
atomicity 原子性
consistency 一致性
isolation 孤立性
durablity 持续性
innoDB使用事务
set autocommit = 0;
create table testtable
(id int not null primary key,
name char(30) not null,
value int not null) engine = InnoDB;
// 注意教材上用的是老版本的type =innodb
// mySQL5.5 之后要用 engine= innodb
mysql > start transaction;
mysql >insert into testtable values
(1, 'lucy', 23);
mysql> commit;
在提交了commit之后 一条数据才完成了写入
如果用了rollback; 那么就会撤销写入
外键
外键就是 某个数据表的一列,是另外一个数据表的真实存在的一列.
比如 orderitems 的orderid,是orders表的orderid外键,如果 orderitems的orderid 写了一个不存在于 orders 表的orderid的值,就报错啦。(很奇怪我在创建的时候并没有报错)
建立一个包含外键的table
mysql > create table order_item2 (
orderid int unsigned not null references orders(orderid),
isbn char(13) not null,
quantity tinyint unsigned,
primary key (orderid, isbn)
) engine= innodb;
看一下orders 里面的order
存储过程
MySQL 支持把一个过程当做函数一样存储下来
比如我们可以 统计 orders这个表所有的行的amount 字段的综合,用sum 函数
mysql> select sum(amount) from orders into @aa;
sum 是内部函数名字,表示取总,amount 是表orders 的字段名字,@aa 是自己定义的 参数
查看@aa 的大小
mysql > select @aa;
mysql > select amount from orders;
会发现@aa 变成了amount的总和。
这一个过程可以用一个文件保存下来:
# basic stored procedure example
delimiter //
create procedure total_orders (out total float)
BEGIN
select sum(amount) into total from orders;
END
//
delimiter ;
另外一个创建函数的例子:
#basic syntax to create a function
delimiter //
create function add_tax(price float) return float
return price*1.1;
//
delimiter ;
我们中间可以通过delimiter 改变分隔符,本来是用;分割,然后到;就去run这个命令。先改成了//,这样可以保存多条MySQL语句(用;分割开)
调用 add_tax function:
select add_tax(100);
查看创立的某条过程或者函数:
show create procedure total_orders;
show create function add_tax;
删除之
drop procedure total_orders;
drop function add_tax;
procedure 和 funtion 有一些差别,比如procedure可以有多个输出,而function有且只有一个输出
MySQL的游标
这里不详细讲了,参考代码
https://github.com/easyfly007/practicephp/blob/master/chap13/controlstructures_cursors.sql
可以调用这个过程
mysql > call largest_order(@l);
mysql > select @l;