MySQL 数据库

多表查询

使用单个select 语句从多个表格中取出相关的查询结果,多表连接通常是建立在有相互关系的父子表上

交叉连接(笛卡尔积)
定义:第一个表格的所有行 乘以 第二个表格中的所有行
语法:
隐式语法(不使用关键字): select * from customers,orders;
显式语法(使用关键字): select * from customers CROSS JOIN orders;
注:交叉连接获得的结果集是错误的

内连接
定义:内连接是在交叉连接的基础上,只列出连接表中与连接条件相匹配的数据行, 匹配不上的记录不会被列出
语法:
隐式语法:
select * from customers,orders where customers.id=orders.customer_id;
显式语法:
select * from customers c INNER JOIN orders o ON c.id=o.customer_id;

外连接
定义:外链接是以一张表为基表,其他表信息进行拼接,如果有就拼接上,如果没有显示null; 外链接分为左外连接和右外连接
1)左外连接: 以关键字左边的表格为基表进行拼接
语法: select * from customers c LEFT JOIN orders o ON c.id=o.customer_id;
2)右外链接: 以关键字右边的表格为基表进行拼接
语法: select * from orders o RIGHT JOIN customers c ON c.id=o.customer_id;

子查询
定义:当进行查询的时候,需要的条件是另外一个select语句的结果,这个时候就会用到子查询,为了给主查询(外部查询) 提供数据而首先执行的查询(内部查询)被叫做子查询; 子查询分为嵌套子查询和相关子查询。
1)嵌套子查询:
内部查询的执行独立于外部查询,内部查询仅执行一次,执行完毕后将结果作为外部查询的条件使用(嵌套子查询中的子查询语句可以拿出来单独运行。)

例:查询出id为1的老师教过的所有学生。
select * from students where id in(select s_id from teacher_student where t_id=1);

1
2

2)相关子查询:
定义:内部查询的执行依赖于外部查询的数据,外部查询每执行一次,内部查询也会执行一次。每一次都是外部查询先执行,取出外部查询表中的一个元组,将当前元组中的数据传递给内部查询,然后执行内部查询。根据内部查询执行的结果,判断当前元组是否满足外部查询中的where条件,若满足则当前元组是符合要求的记录,否则不符合要求。然后,外部查询继续取出下一个元组数据,执行上述的操作,直到全部元组均被处理完毕。

例:每一科考试成绩大于平均分的学生的分数。
select * from score as a where a.score>(select avg(b.score) from score as b where a.cou_id=b.cou_id);

1
2

聚合函数

SUM():求和函数
AVG():平均函数
MAX():最大值函数
MIN():最小值函数
COUNT():统计数量函数
select count() from 表名;*
select count(id) from 表名;效率比count(*)效率高
注意:聚合函数会排除null值的数据

1
2
3
4
5
6
7
8

分页查询

group by()
GROUP BY子句的真正作用在于与各种聚合函数配合使用。它用来对查询出来的数据进行分组。
分组的含义是:把该列具有相同值的多条记录当成一组记录处理,最后只输出一条记录。分组函数忽略空值。

例:对性别进行分组在分组基础上进行聚合函数总计
select sex,count(*) as “人数” from students group by sex;

1
2
3
4
5
6

分组筛选

分组筛选(group by + having(条件))
例:查询人数大于2的性别
– 1)分组 2)统计 3)条件
select sex ,count() from student group by sex having count()>2;

(1)、分组函数的重要规则
1)如果使用了分组函数,或者使用GROUP BY 的查询:出现在SELECT列表 中的字段,要么出现在聚合函数里,要么出现在GROUP BY 子句中。
2)GROUP BY 子句的字段可以不出现在SELECT列表当中。

(2)、having where 的区别
①、where和having都是用来做条件限定的,
②、WHERE是在分组(group by)前进行条件过滤,
③、HAVING子句是在分组(group by)后进行条件过滤,
④、WHERE子句中不能使用聚合函数,HAVING子句可以使用聚合函数。
⑤、HAVING子句用来对分组后的结果再进行条件过滤

mysql常识
以“;”号结束,否则会一直等待,少数的命令不需要“;”号,如QUIT;系统默认“;”号结束处才是一条命令的结束,才真正开始执行;多个短命令,可以放在一起,中间用“;”号隔开;我们也可借助外部工具,如navicat来管理数据为库,在navicat中单个查询命令也可以以“;”号结束,但在复杂查寻的内部,则不能有“;”号;可以将多条命令写在一个sql文件中,不同的命令之间用“;”号隔开,否则会出错,如下所示

CREATE TABLE person (id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,name CHAR(60) NOT NULL,PRIMARY KEY (id));
create table shirt (id smallint unsigned not null auto_increment,style enum('t-shirt','polo','dress') not null,color enum('red','blue','orange','white','black') not null,owner smallint unsigned not null references person(id),primary key (id));

insert into person values (null,'Antonio Paz');
select @last:=last_insert_id();
insert into shirt values (null,'polo','blue',@last),(null,'dress','white',@last),(null,'t-shirt','blue',@last);

insert into person values (null,'Lilliana Angelovska');
select @last:=last_insert_id();
insert into shirt values (NULL, 'dress', 'orange', @last),(NULL, 'polo', 'red', @last),(NULL, 'dress', 'blue', @last),(NULL, 't-shirt', 'white', @last);
select * from person;
select s.* from person p,shirt s where p.name like 'Lilliana%' and s.owner=p.id and s.color !='white';

然后使用source命令批量执行。

mysql中命令不区分大小写,但创建数据库的时候要注意大小写,大写的数据库名称,查询的时候用小写查不出来,同时也要与linux shell和python相区别,它们的编程是区分大小写的;
使用navicat将txt文本load进数据库出现乱码,首先查看txt文件是否是utf-8格式;然后在navicat中设置数据库属性,字符集选utf8mb4 – UTF-8 Unicode或utf8 – UTF-8 Unicode,排序规则选utf8mb4_general_ci或utf8_general_ci;

mysql状态表:

提示符 含义
mysql> 准备好接受新的命令
-> 等待多选命令的下一行
‘> 等待下一行,等待以单引号“’”开始的字符串的结束
“> 等待下一行,等待以双引号“””号开始的字符串的结束
> 等待下一行,等待以反斜点“”号开始的字符串的结束
/> 等待下一行,等待以/号开始的注释的结束
mysql基本操作汇总
操作 代码 解释
mysql连接 mysql -h 主机名 -u mysql用户名 -p 连接mysql通常需要提供用户名和密码,如果登录服务器之外的其他机器,还需要指定主机名称,运行后会提示输入密码,登录mysql后,会出现mysql>; windows下直接在命令行客户端输入密码则可以登录mysql的shell
mysql连接 mysqldump: Got error: 2002: Can’t connect to local MySQL server through socket 一是,修改mysql配置文件里的socket项的值为 ‘安装目/mysql.sock’,不过这种方法需要重启mysql服务,很不厚道。二是,为/tmp/mysql.sock创建一个软链接到 ‘安装目录/mysql.sock’:ln -s ‘安装目录/mysql.sock’ /tmp/mysql.sock
查看版本信息 SELECT VERSION(); 当前mysql版本信息
查看用户信息 SELECT USER();
断开mysql连接 QUIT linux下也可以按ctrl+D键断开连接
取消正在输入的语句 \c 回到mysql>命令等待状态
查看日期 SELECT CURRENT_DATE; mysql中日期是以2017-11-07为标准形式的,mysql有好一些对日期进行格式化及日期计算的函数
计算器 比如SELECT (4+1)5; 可以得到结果25
查看mysql中的数据库 SHOW DATABASES; 显示一列已存在的数据库名称
找出当前选择了哪个数据库 SELECT DATABASE();
选择某数据库 USE 数据库名称; 之后就可以对数据进行相关操作
创建数据库 CREATE 数据库名称; 注意数据库名称是区分大小写的,后续访问要与之相同;数据只要创建一次就行,刚创建的数据库是空的
显示数据库表 SHOW TABLES;
创建数据库表 CREATE TABLE PET (name VARCHAR(20),ower VARCHAR(20),species VARCHAR(20),sex CHAR(1),birth DATE,death DATE [,primary key(name ,ower )]) [engine=MYISAM,default charset=utf8]; VARCHAR是可变字长,可以是1~65535中的任何一个,如果后面发现之前的设置不合理,可以使用ALTER TABLE来更改;[]部分表示可选,关于Mysql 主键约束Primary Key
创建数据库表 CREATE TABLE 通过default charset=gb2312 可用中文来命名字段,但实际上跟其他程序一起用的时候还是容易出问题
查看数据库表的结构信息 DESCRIBE PET;
将数据装入数据库表 LOAD DATA LOCAL INFILE ‘/path/pet.txt’ INTO TABLE PET; 如果是在window下,使用“\r\n”作为行结束符的,应该使用LOAD DATA LOCAL INFILE ‘/path/pet.txt’ INTO TABLE PET LINES TERMINATED BY ‘\r\n’;同时要注意txt文本的编码格式,有可能开关会多出一些字符
插入数据到数据库表 INSERT INTO PET VALUES (“Buffy”,“Harold”,“dog”,“f”,"1989-05-13 “,null); 在插入数据时,都需要用”“号,但是空值时不能用”“号,直接用null或\N都可以
操作 代码 解释
数据库中检索信息 SELECT what_to_select FROM which_table WHERE conditions_to_satisfy; 可以获取整个表,也可以只获取一部分字段,可以作用WHERE来筛选符合特定要求的数据,还可以用AND和OR对多个条件组合,可以用GROUP BY按某些字段分组,可以用ORDER BY按某字段排序;更复杂的条件需要逻辑运算的,通过()号将一部分运算结果作为一整体,另一部分运算结果用()作为一个整体,中间通过逻辑运算符连接;我们也查询到的列进行重命名
按条件查询 select from STUDENT HAVING STU_AGE in(11,12); HAVING具有与where相同的效果,但是where是在获得查询结果前进行筛选,而HAVING是在获取查询结果后在结果中筛选,因而可以用在更复杂的情景中,比如HAVING可以order by 、group by等关键词之后,而where则在这些关键词之前
查询一个字段对应的多个值 select from STUDENT where STU_AGE in(11,12); IN关键字可以判断某个字段的值是否在指定的集合中。如果字段的值在集合中,则满足查询条件,该纪录将被查询出来。如果不在集合中,则不满足查询条件。
按范围查询 用between 值1 and 值2,或大于and小于 虽然几乎所有的数据库都支持 BETWEEN … AND 运算符,但不同的数据库对 BETWEEN … AND 处理方式是有差异的。在 MySQL 中,BETWEEN 包含了 value1 和 value2 边界值,如上面选取 uid 在 2 到 5 之间的用户数据例子。而有的数据库则不包含 value1 和 value2 边界值(类似于大于 and 小于),也有数据库包含 value1 而不包含 value2(类似于 大于等于 and小于)。所以在使用 BETWEEN … AND 的时候,请检查你的数据库是如何处理 BETWEEN 边界值的。
查询唯一值 SELECT DISTINCT what_to_select FROM which_table WHERE conditions_to_satisfy; 选出符合条件的记录并去重,其实通过group by 也能达到 去重的目的,有的时候更方便更好控制结果按自己想要的方式呈现
从某一行开始查询 select from table_name limit 第几行,行数; 第几行是从0开始的,即0代表第一行
读取最后几行 select from table_name order by id desc limit 第几行,行数;
排序 SELECT name, species, birth FROM pet ORDER BY species, birth DESC; DESC表示按降序排序结果, order by 多个条件时,先按第一个条件排再按第二个条件排
复合查询 SELECT * FROM (SELECT name, species, birth FROM pet)AS TABLE1 ORDER BY species, birth DESC; DESC表示按降序排序结果, order by 多个条件时,先按第一个条件排再按第二个条件排
删除表中数据 DELETE FROM which_table; 和标准的SQL语句不同,DELETE支持ORDER BY和LIMIT子句,通过这两个子句,我们可以更好地控制要删除的记录。如当我们只想删除WHERE子句过滤出来的记录的一部分,可以使用LIMIB,如果要删除后几条记录,可以通过ORDER BY和LIMIT配合使用。假设我们要删除users表中name等于"Mike"的前6条记录。可以使用如下的DELETE语句:
DELETE FROM users WHERE name = ‘Mike’ LIMIT 6;
一般MySQL并不确定删除的这6条记录是哪6条,为了更保险,我们可以使用ORDER BY对记录进行排序。
DELETE FROM users WHERE name = ‘Mike’ ORDER BY id DESC LIMIT 6;
修改数据 UPDATE pet SET DEATH=“1999-09-12” WHERE NAME=“Claws”;
UPDATE temp_id_area SET SF = CONCAT(split(SF,‘市’,1),‘市’) WHERE LOCATE(‘市’,SF);
UPDATE temp_id_area SET SF = CONCAT(split(SF,‘地区’,1),‘地区’) WHERE LOCATE(‘地区’,SF);
UPDATE temp_id_area SET SF = CONCAT(split(SF,‘自治区’,1),‘自治区’) WHERE LOCATE(‘自治区’,SF);
UPDATE temp_id_area SET SF = CONCAT(split(SF,‘省’,1),‘省’) WHERE LOCATE(‘省’,SF);
UPDATE temp_id_area SET SFBM = SUBSTR(SSBM,1,2);
时间与日期 SELECT CURRENT_DATE;或SELECT CURDATE(); 获取当前日期
获取日期的年、月、日 SELECT YEAR(CURDATE());
SELECT MONTH(CURRENT_DATE);
SELECT DAY(CURRENT_DATE); CURRENT_DATE也可以换成其他日期格式的数据;也可以用取模的方式来间接获取月份,如SELECT MOD(CURDATE(),12);但注意,此时的范围是0-11,因而如果是12月份要加1
加上时间隔 SELECT DATE_ADD(CURDATE(),INTERVAL 1 MONTH); 假如当前日期是2017-11-07,得到的结果将是2017-12-07
null操作 使用IS NULL或IS NOT NULL来作为判断; mysql中null表示空,没有值,null不能与用算术比较符操作;
在GROUP BY中,两个null视为相同;执行ORDER BY ,null排在最前面,加上DESC则排在最后面
标准SQL模式匹配 使用LIKE或NOT LIKE,而不能使用=或!= mysql提供标准的SQL模式匹配,以及基于像linux实用程序vi,grep,sed的正则表达式模式匹配,在mysql中模式默认忽略大小写
” 匹配任何单个字符
“%” 匹配任意数目字符,包括零字符
扩展正则表达式 REGEXP或NOT REGEXP或RLIKE或NOT RLIKE 为了定位一个模式,以便匹配被测试值的开始或结束,以"^“在模型的开头,表示匹配以某模式开始的记录;以”KaTeX parse error: Double superscript at position 394: …GEXP BINARY '^b'̲; 要想找出以“fy”结尾的…’;
要想找出包含“w”的名字 SELECT * FROM PET WHERE name LIKE ‘%w%’; SELECT * FROM PET WHERE name REGEXP ‘W’;
要想找出正好包含5个字符的名字,使用“
”模式字符 SELECT * FROM PET WHERE name LIKE ‘_____’; SELECT * FROM PET WHERE name REGEXP '^…KaTeX parse error: Expected 'EOF', got '\c' at position 1192: …断开连接 取消正在输入的语句 \̲c̲ ̲回到mysql>命令等待状态 …“在模式的结尾,表示匹配以某模式结束的记录;要想使用regexp来强制区分大小写需要使其中一个字符转换为二进制字符
‘.’ 匹配任意单个的字符
“[XXX]” 匹配在方括号内的任意字符,如”[abc]“匹配"a"或"b"或"c”;”[a-z]“匹配任何字母,因为mysql不区分大小写;”[0-9]"匹配任何数字
"
" 匹配一个或任意多个出现在它前面的字符,如"x
"匹配任意数量的x,"[0-9]
“匹配任何数量数字,”."匹配任何数量的任意字符
要想找出以“b”开头的名字 SELECT * FROM PET WHERE name LIKE ‘b%’; SELECT * FROM PET WHERE name REGEXP ‘^b’;
要想找出以“b”开头的名字,只要小写b开头的 SELECT * FROM PET WHERE name REGEXP BINARY ‘^b’;
要想找出以“fy”结尾的名字 SELECT * FROM PET WHERE name LIKE ‘%fy’; SELECT * FROM PET WHERE name REGEXP ‘fyKaTeX parse error: Expected group after '_' at position 160: …ERE name LIKE '_̲____'; SELECT *…’; 或者用.{5}代替5个点
计数 SELECT COUNT(
) FROM PET ;
SELECT COUNT() FROM PET GROUP BY SEX ; 使用计数如果不需要检索整个表,应该用where来限定范围提高效率
最大值 MAX() (请注意,MIN和MAX函数会忽略NULL值)
最小值 MIN() (请注意,MIN和MAX函数会忽略NULL值)
平均值 AVG()
求和 SUM() 以上几个都需要配合group by使用
使用一个以上的表 SELECT pet.name,event.remark FROM pet,event where pet.name =event.name AND event.type=‘little’; FROM子句列出两个表,因为查询需要从两个表提取信息。当从多个表组合(联结)信息时,你需要指定一个表中的记录怎样能匹配其它表的记录。这很简单,因为它们都有一个name列。查询使用WHERE子句基于name值来匹配2个表中的记录。因为name列出现在两个表中,当引用列时,你一定要指定哪个表。把表名附在列名前即可以实现
一个表的记录与同一个表的其它记录进行比较 SELECT p1.
,p2.* FROM pet as p1,pet as p2 WHERE p1.species = p2.species AND p1.sex = ‘f’ AND p2.sex = ‘m’;
批量运行 mysql> source filename ; filename 中的多条sql语句末尾一定要加上“;”号,否则出错

MYSQL 数据乱码和字符集问题
MySQL的字符集问题
关于MySQL的字符集问题更详细可参考
MySQL的字符集支持(Character Set Support)有两个方面:
字符集(Character set)和排序方式(Collation)。
对于字符集的支持细化到四个层次:
服务器(server),数据库(database),数据表(table)和连接(connection)。

MySQL默认字符集
MySQL对于字符集的指定可以细化到一个数据库,一张表,一列,应该用什么字符集。
但是,传统的程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置,那么,默认的配置从何而来呢?
(1)编译MySQL 时,指定了一个默认的字符集,这个字符集是 latin1;
(2)安装MySQL 时,可以在配置文件 (my.cnf) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;
(3)启动mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的配置,此时 character_set_server 被设定为这个默认的字符集;
(4)当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为character_set_server;
(5)当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;
(6)在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;
(7)当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;
简单的总结一下,如果什么地方都不修改,那么所有的数据库的所有表的所有栏位的都用
latin1 存储,不过我们如果安装 MySQL,一般都会选择多语言支持,也就是说,安装程序会自动在配置文件中把
default_character_set 设置为 UTF-8,这保证了缺省情况下,所有的数据库的所有表的所有栏位的都用 UTF-8 存储。

查看默认字符集
(默认情况下,mysql的字符集是latin1(ISO_8859_1)
通常,查看系统的字符集和排序方式的设定可以通过下面的两条命令:

show variables like 'character%';

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

show variables like 'collation%'

+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+

修改默认字符集
(1) 最简单的修改方法,就是修改mysql的my.cnf文件中的字符集键值,一般情况下my.cnfd在/etc文件夹下。如果没有可以自己创建该文件。并添加如下内容:(还没验证)

default_character_set = utf8
character_set_server = utf8

修改完后,重启mysql的服务,service mysql restart
使用 mysql> SHOW VARIABLES LIKE ‘character%’;查看,发现数据库编码均已改成utf8
(2) 还有一种修改字符集的方法,就是使用mysql的命令
在登录数据库时,我们用mysql --default-character-set=字符集-u root -p进行连接,这时我们再用show variables like ‘%char%’;命令查看字符集设置情况,可以发现客户端、数据库连接、查询结果的字符集已经设置成登录时选择的字符集了;
如果是已经登录了,可以使用set names 字符集;命令来实现上述效果,等同于下面的命令:

mysql> set character_set_client=utf8;
mysql> set character_set_connection=utf8;
mysql> set character_set_database=utf8;
mysql> set character_set_results=utf8;
mysql> set character_set_server=utf8;
mysql> set character_set_system=utf8;
mysql> set collation_connection=utf8;
mysql> set collation_database=utf8;
mysql> set collation_server=utf8;

(3)其他的一些设置方法:
修改数据库的字符集

mysql>use mydb
mysql>alter database mydb character set utf-8;

创建数据库指定数据库的字符集`

mysql>create database mydb character set utf-8;

mysql中文乱码问题
解决乱码的方法是,在执行SQL语句之前,将MySQL以下三个系统参数设置为与服务器字符集character-set-server相同的字符集。
character_set_client:客户端的字符集。
character_set_results:结果字符集。
character_set_connection:连接字符集。
关于编码格式GBK、GB2312、UTF8
UTF- 8:Unicode Transformation Format-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。

GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。

GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312

对于一个网站、论坛来说,如果英文字符较多,则建议使用UTF-8节省空间。不过现在很多论坛的插件一般只支持GBK。

GB2312是GBK的子集,GBK是GB18030的子集
GBK是包括中日韩字符的大字符集合
如果是中文的网站 推荐GB2312 GBK有时还是有点问题
为了避免所有乱码问题,应该采用UTF-8,将来要支持国际化也非常方便
UTF-8可以看作是大字符集,它包含了大部分文字的编码。
使用UTF-8的一个好处是其他地区的用户(如香港台湾)无需安装简体中文支持就能正常观看你的文字而不会出现乱码。

gb2312是简体中文的码
gbk支持简体中文及繁体中文
big5支持繁体中文
utf-8支持几乎所有字符

解决方法
首先分析乱码的情况
1.写入数据库时作为乱码写入
2.查询结果以乱码返回
究竟在发生乱码时是哪一种情况呢?
我们先在mysql 命令行下输入
show variables like ‘%char%’;
查看mysql 字符集设置情况:
文件系统字符集是固定的,系统、服务器的字符集在安装时确定,与乱码问题无关;乱码的问题与客户端、数据库连接、数据库、查询结果的字符集设置有关。
*注:客户端是看访问mysql 数据库的方式,通过命令行访问,命令行窗口就是客户端,通过JDBC 等连接访问,程序就是客户端。
我们在向mysql 写入中文数据时,在客户端、数据库连接、写入数据库时分别要进行编码转换在执行查询时,在返回结果、数据库连接、客户端分别进行编码转换。现在我们应该清楚,乱码发生在数据库、客户端、查询结果以及数据库连接这其中一个或多个环节。

执行事务
事务机制可以确保数据的一致性
事务有四个属性:原子,一致,隔离,持久型;通常称为ACID
Python DB API 2.0 的事务提供了两个方法 commit 或 rollback
比如

#使用预处理语句创建表
sql = """insert into t(id,name)
         values(1,'china')"""
try:
   # 执行sql
   cursor.execute(sql)
   # 提交到数据库执行
   db.commit()
except:
   # 如果发生错误
   db.rollback()

对于支持事务的数据库,在python数据库编程中,当游标建立之时,就自动开始了一个隐形的数据库事务,这个区别于mysql客户端。
commit()方法提交所有的事务,rollback()方法回滚当前游标的所有操作。每个方法都开启了一个新的事务。

8、错误处理
DB API中定义了一些数据库操作的错误及异常
异常 描述
Warning 当有严重警告时触发,例如插入数据是被截断等等。必须是 StandardError 的子类。
Error 警告以外所有其他错误类。必须是 StandardError 的子类。
InterfaceError 当有数据库接口模块本身的错误(而不是数据库的错误)发生时触发。 必须是Error的子类。
DatabaseError 和数据库有关的错误发生时触发。 必须是Error的子类。
DataError 当有数据处理时的错误发生时触发,例如:除零错误,数据超范围等等。 必须是DatabaseError的子类。
OperationalError 指非用户控制的,而是操作数据库时发生的错误。例如:连接意外断开、 数据库名未找到、事务处理失败、
内存分配错误等等操作数据库是发生的错误。 必须是DatabaseError的子类。
IntegrityError 完整性相关的错误,例如外键检查失败等。必须是DatabaseError子类。
InternalError 数据库的内部错误,例如游标(cursor)失效了、事务同步失败等等。 必须是DatabaseError子类。
ProgrammingError 程序错误,例如数据表(table)没找到或已存在、SQL语句语法错误、 参数数量错误等等。必须是DatabaseError的子类。
NotSupportedError 不支持错误,指使用了数据库不支持的函数或API等。例如在连接对象上 使用.rollback()函数,
然而数据库并不支持事务或者事务已关闭。 必须是DatabaseError的子类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值