Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >跨站数据测试

《PHP MySQL和WEB开发》笔记 第十三章 MySQL高级编程

13.1  load data infile

批量插入数据。用法:

mysql> load data infile "c:/users/administrator/desktop/bookinsert.txt" into table books;
Query OK, 2 rows affected (0.03 sec)
Records: 2  Deleted: 0  Skipped: 0  Warnings: 0

13.2存储引擎(也叫表格类型)

已知的有MyISAM和Innodb。

建立表格时可以指定引擎。

create 后面加上engine=myisam

TYPE=MyISAM 和 ENGINE=MyISAM 都是设置数据库存储引擎的语句 (老版本的MySQL使用TYPE而不是ENGINE(例如,TYPE = MYISAM)。 MySQL 5.1为向下兼容而支持这个语法,但TYPE现在被轻视,而ENGINE是首先的用法。 一般地,ENGINE 选项是不必要的;除非默认已经被改变了,MyISAM是默认存储引擎。

create table test1 (id int) engine=MyISAM;

create table test2 (id int) engine MyISAM;

引擎的种类:

MyISAM:默认类型。基于传统的ISAM。Indexed Sequential Access Method。可以检查和修复表格,MyISAM可以被压缩,支持全文搜索,但是不支持外键,不具备事物安全性。

InnoDB:一个事物安全的表,提供了commit和rollback功能。支持外键。

绝大多数数据库室友MyISAM和InnoDB表组成。

什么时候用MyISAM:使用大量的select和insert(MyISAM速度快),需要使用全文搜索,WEB应用程序(例如分类)

什么时候用InnoDB:insert和select交替执行,例如消息栏或者论坛系统,存储财务数据。

什么时候用memery:临时表或者用于实现视图。

什么时候用merge:处理大量的MyISAM。

其他存储类型:

memory:哈希分布,速度很快,但是只要崩溃数据就消失。吞噬内存,同时不支持blob,text,autoincrement列。

merge:把MyISAM表弄成一个单表。

csv:在文件查看的时候完全可以用excel打开看数据。注:不支持非空类型。

mysql> create table ck_csv(id int)engine csv;
ERROR 1178 (42000): The storage engine for the table doesn't support nullable columns
mysql> create table ck_csv(id int not null,name char(10) not null,address char(20) not null)engine csv;
Query OK, 0 rows affected (0.08 sec)

把txt数据导入csv表,在换行的地方出错:txt文件的第一个字符自动添加了一个空格,不知道为什么,换个表试试呢

txt用TAB和换行符分开的,table是csv格式的,这两个文件都是utf-8

问题:1.使用load data infile “c/users/administrator/desktop/insert_txt” into table ck_txt2tb;

会出现问题,txt 的开头的那个1 自动被添加了一个空格,虽然仍然会录入表中,但是有格式问题,或者不显示数字或汉字。

mysql> show warnings;
+---------+------+----------------------------------------------------------+
| Level   | Code | Message                                                  |
+---------+------+----------------------------------------------------------+
| Warning | 1366 | Incorrect integer value: ' 1' for column 'id' at row 1   |
+---------+------+----------------------------------------------------------+
如果txt是ANSI则不会出现这个问题只是无法插入汉子。

现在不知道原因,(百度搜不到,谷歌英语太烂)希望以后能找到原因。

解决办法:使用用fields terminated by 和line terminated by 下,默认是换行和tab的。

并不管用,加引号试一下。

"1"	"tom"
"2"	"bob"
"3"	"luhao"
"4"	"wenbo"

也不行。

后来想到1前面的空格难道也是什么字符,试了一下是\r\n;

总结:\n是换行,英文是New line \r是回车,英文是Carriage return


网上说的/n/r表示记事本的换行符是不正确的,正确的应该是/r/n。

重新演示一遍如何将记事本文字数据换成table文字。

load data infile "c/users/administrator/desktop/insert.txt" into table ck_txt2tb fields terminated ' ' lines terminated by '\r\n';


SQL语言的五种类型DDL、DCL、DQL、DML、TML(参考)

数据定义语言:Data Definition Language:create、alter、drop、truncata

数据查询语言:Data Query Language:select

数据操作语言:Dtat Manipulation Language:insert,update,delete

数据控制语言:Data Control Language:grant,revoke,deny

事物控制语言:Transaction Control Language:commit,rollback,set transation



13.3事物

四个事物正确执行的四个基本要素ACID:

Atomicity(原子性):事物要么全部完成,要么全部不完成。如果只进行了一半,那么应该回滚。

Consistency(一致性):一个数据他能使整个数据一致,不管并发事物有多少,也不会无缘无故多或者少数据。

Isolation(隔离性):同一时间仅有一个请求对于这个数据,未完成的事物不能被其他用户所见。

Durability(持续性):事物完成后会持久的保存,并不会回滚。


13.3.2通过InnoDB使用事物

使用数据安全模式时候先关闭自动提交

mysql> show variables like 'auto%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 1     |
| auto_increment_offset    | 1     |
| autocommit               | ON    |
| automatic_sp_privileges  | ON    |
+--------------------------+-------+
4 rows in set (0.00 sec)

mysql> set autocommit=0;
Query OK, 0 rows affected (0.03 sec)

mysql> show variables like 'auto%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 1     |
| auto_increment_offset    | 1     |
| autocommit               | OFF   |
| automatic_sp_privileges  | ON    |
+--------------------------+-------+
4 rows in set (0.00 sec)

现在事物提交被打开了,自动提交就被关闭了,就要在使用数据提交之前加入 

statrt transaction;

DML

commit;

当使用MyISAM的时候不管是不是使用了commit,数据都会自动提交的,因此他是不安全的。

当使用innodb的时候,使用了commit时才会提交,但是好像并不需要使用start transaction。最好还是使用一下子吧 会规范。

当不使用start transaction 的时候,使用rollback没反应。

rollback是在commit 之前使用的!!!

测试一下statrt transaction的作用。

经过测试,在InnoDB中 使用 start transaction也有commit的作用。这一点是网上和书上没有说到的,要注意。mysql版本5.6.17

start transaction=commit + 重新开始。

这是测试代码希望有朋友可以试一下。

先链接数据库
create database test1018;
use test1018;
create table ck_innodb(id int,name char(10))engine innodb;
set autocommit=0;
show variables like 'autocommit';
insert into ck_innodb values(1,'zhangchen');
select * from ck_innodb;
应该有数据,然后再去其他窗口(2号窗口)运行
select * from ck_innodb;
应该没有数据
然后再返回刚才的窗口 start transaction;
去2号窗口执行
select * from ck_innodb;
发现数据被提交了
……

并不是很重要的,只是为了理解的更深一些。

通常COMMIT或ROLLBACK语句执行时才完成一个事务,但是有些DDL语句等会隐式触发COMMIT,所以应该在事务中尽可能少用或注意一下。

13.4外键

使用外键可以让数据库自动检查操作。

创建外键

mysql> create table ck_foreign2 (id int,name char(10),orderid int(10) unsigned,foreign key(orderid) references orders(or
derid))engine innodb;
Query OK, 0 rows affected (0.22 sec)
因为orders表的orderid是unsigned所以这个也要说明,否则建立不了。

删除外键

首先show create table ck_foreign3

会显示外键的名称,通常是自动生成的。

然后使用alter table ck_foreign3 drop foreign key 外键名来删除外键,因为在创建外键的时候还创建了一个索引(没有索引名的),所以如果有需要还可以删除索引

alter table ck_forengn3 drop index orderid;或者drop index orderid on ck_foreign2


添加外键

alter table ck_forengn2 add foreign key (orderid) references orders(orderid);

因为最好有名称,所以添加外键时这样添加

alter table ck_foreign2 add constraint ff foreign key (orderid) references orders(orderid);

创建的时候

mysql> create table ck_create_fk(id int(10),name char(10),orderid int(10) unsigned,constraint kf foreign key (orderid) r
eferences orders(orderid))engine innodb;
Query OK, 0 rows affected (0.28 sec)

这样会得到两个key,一个名为fk的foreign key 一个名为fk的位于orderid的普通key。如下:

| ck_create_fk | CREATE TABLE `ck_create_fk` (
  `id` int(10) DEFAULT NULL,
  `name` char(10) COLLATE utf8_bin DEFAULT NULL,
  `orderid` int(10) unsigned DEFAULT NULL,
  KEY `kf` (`orderid`),
  CONSTRAINT `kf` FOREIGN KEY (`orderid`) REFERENCES `orders` (`orderid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin |

如果插入不符合外键的会报错

mysql> insert into ck_foreign2 values (1,'luhao',1);
Query OK, 1 row affected (0.05 sec)

mysql> insert into ck_foreign2 values (2,'luhao',11);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`lustudy`.`ck_foreign2`, CONSTRAIN
T `ff` FOREIGN KEY (`orderid`) REFERENCES `orders` (`orderid`))

13.5存储过程(下一次看的时候学习)

(待学习)


除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: 一个浙大CS本科生关于2018届秋招(前端方向)的一些干货

下一篇: Wi-Fi 爆重大安全漏洞,Android、iOS、Windows 等所有无线设备都不安全了

精华推荐