• JAVA开发中常用RDMS


    一、前言

    JAVA的开发离不开数据库的支持,常见的有关系型数据库和非关系型数据库。java除了处理不依赖与数据库的通信技术。很多的java项目或者应用程序都需要建立在数据库的基础上。所以java开发早已经不是单纯的java开发,更多的是基于对数据的处理,比如对数据的增删查改等操作。常见的数据库包括mysql 、oracle、postgreSql、达梦、serverSQL等。这类数据库成为关系型数据库,它们的逻辑存储模型为二维表的集合。还有一些非关系型数据库,它们是相对关系型数据库而言的,如:HBASE、mongodb、es、redis等。它们的逻辑存储结构模型是键值,或者文档的形式存储。本章内容总结Java开发中RDMS的一些使用。

    二、以mysql为例介绍RDMS

    mysql是常用的关系型数据库,它是数据二维表的集合。

    从应用的角度,我们要使用mysql数据库,首先就是需要安装mysql数据库,这里略过。那么我们就需要有一个登录数据库的用户名和密码。然后我们登录上数据库,建立一个库名,我们假定它为test-db,

    CREATE DATABASE 数据库名;

    我们就可以在库里建表,比如建表t_user

    CREATE TABLE table_name (column_name column_type);

    这就是关系数据库

    三、mysql语法大全

    1.创建数据库
    代码如下(示例):

    create database 数据库名;

    2.显示所有数据库
    代码如下(示例):

    show databases;

    3.选择数据库
    代码如下(示例):

    use 数据库名;

    4.删除数据库
    代码如下(示例):(此操作不可逆,谨慎操作)

    drop database 数据库名;

    5.创建数据表
    代码如下(示例):

    create table 数据表名(字段,字段,字段);

    6.插入数据
    代码如下(示例):

    1. insert into 数据表名(字段,字段,字段) values (值,值,值);
    2. insert into 数据表名 value(值,值,值);
    3. insert into 数据表名 value
    4. 值,值,值,
    5. 值,值,值,
    6. 值,值,值);/*插入多行*/

    7.修改数据
    代码如下(示例):

    update 表名 set 字段名=where 条件;

    8.将数据表中某一字段所有值修改为指定值
    代码如下(示例):

    update 表名 set 字段名=值;

    9.删除某条数据
    代码如下(示例):

    delete from 表名 where 条件;

    10.查询
    代码如下(示例):

    select 字段或* from 数据表名 where 条件;

    11.表中增加一列
    代码如下(示例):

    alter table 数据表名 add clumn 要加的字段名 字段类型(长度) not null;/*不为空操作*/

    12.修改某一列
    代码如下(示例):

    alert table 数据表名 modify 列名 字段类型(长度);

    13.删除某一列
    代码如下(示例):

    alter table 数据表名 drop 列名;

    14.删除一个表
    代码如下(示例):

    1. delete from 数据表名;
    2. drop table 数据表名;
    3. truncate table 数据表名;

    a:delete可以删除一个表的所有数据,也可后面跟where条件,删除部分数据;

    b:drop会删除表的结构和所有数据;

    c:truncate会删除一个表的所有数据。
    注意:delete删除的数据可以事物可以回滚;drop会删除表结构及其中的所有数据,谨慎使用;truncate删除的数据事物不可回滚,谨慎使用。

    15.模糊查询
    代码如下(示例):

    select 字段或* from 数据表名 where 字段名 like '%值%';

    16.排序
    代码如下(示例):

    SELECT 字段或* from 数据表名 WHERE 条件 ORDER BY `id` DESC;

    以id为准倒序排列,ASC是默认排序,DESC是倒序排列

    17.分页查询
    代码如下(示例):

    1. select 字段或* from 数据表名 where 条件 order by 'id' desc limit 0,5;/*0行起,每页5行数据*/
    2. --limit 子句 (限制查询结果数量)
    3. --limit offset,length 语法解析: offset是指偏移量,默认为0; length是指需要显示的记录数.
    4. --分页示例说明:
    5. $page = 3; //第三页
    6. $pageSize = 10; //页面显示10条记录
    7. $offset = ($page - 1) * $pageSize; //偏移量为20
    8. limit $offset,$pageSize //实现分页 偏移20,显示10
    9. 例如:select * from student where score >60 order by score,name desc limit 1,3;--查询score大于80,排序score升序和name降序,偏移量为1,显示3条记录

    18.连接数据库与退出
    代码如下(示例):

    1. /*连接mysql*/
    2. mysql -h 地址 -P 端口 -u 用户名 -p 密码
    3. 例如: mysql -h 127.0.0.1 -P 3306 -u root -p ****
    4. /*退出mysql*/
    5. exit;

    19.修改字段排序
    代码如下(示例):

    1. /*关键字:first 修改字段排序,把某个字段放在最前面*/
    2. alter table 表名 modify 字段名 字段类型 [字段选项] first;
    3. 例如: alter table test modify name varchar(100) not null default 'admin' comment '最前面' first;
    4. /*关键字:after 修改字段排序,字段名1放在字段名2的后面*/
    5. alter table 表名 modify 字段名1 字段类型 [字段选项] after 字段名2;
    6. 例如: alter table test modify name varchar(100) not null default 'admin' comment 'time字段后面' after time;

    20.修改字段类型
    代码如下(示例):

    1. /*关键字:modify 修改字段类型*/
    2. alter table 表名 modify 字段名 新的字段类型 [新的字段选项];
    3. 例如: alter table test modify name varchar(100) not null default 'admin' comment '修改后名字';

    21.重命名
    代码如下(示例):

    1. /*关键字:change 重命名字段*/
    2. alter table 表名 change 原字段名 新字段名 新的字段类型 [新的字段选项];
    3. 例如: alter table test change name username varchar(50) not null default '' comment '用户名字';

    22.修改表选项
    代码如下(示例):

    1. /*修改表选项*/
    2. alter table 表名 表选项信息;
    3. 例如: alter table test engine Myisam default charset gbk; --修改存储引擎和修改表的字符集

    23.mysql数据类型
    代码如下(示例):

    1. #MySQL数据类型
    2. /*MySQL三大数据类型:数值型、字符串型和日期时间型*/

    24.mysql属性
    代码如下(示例):

    1. #MySQL列属性
    2. /*nullnot nulldefault、primary key、auto_increment、comment*/
    3. MySQL真正约束字段的是数据类型,但是数据类型的约束太单一,需要有一些额外的约束,来更加保证数据的合法性.
    4. MySQL常用列属性有:nullnot nulldefault、primary key、auto_increment、comment.
    5. /*空属性: nullnot null*/
    6. 空属性: null(空,默认) 和 not null(不为空). mysql数据库默认字段都是为null的,实际开发过程中尽可能保证所有的数据都不应该为null,空数据没有意义.
    7. 例如: create table test(
    8. a int not null,
    9. b int
    10. );
    11. insert into test (a,b) values(10,null);
    12. insert into test (a,b) values(null,10);--报错

    25.默认值
    代码如下(示例):

    1. /*默认值: default*/
    2. default: 自定义默认值属性,通常配合not null一起使用.
    3. 例如: create table test1(
    4. a int not null default 200,
    5. b int
    6. );
    7. insert into test1(b) values(20);--或 insert into test1(a,b) values(default,20);

    26.主键
    代码如下(示例):

    1. /*主键|唯一索引*/
    2. Mysql中提供了多种索引? (下文索引更多解析)
    3. 1.主键索引:primary key
    4. 2.唯一索引:unique key
    5. 3.全文索引:fulltext index
    6. 4.普通索引:keyindex
    7. 主键:primary key 一张表中只能有一个字段可以使用对应的主键,用来唯一的约束该字段里面的数据,不能重复和不能为null.
    8. 设置主键有两种方式:
    9. (1)在定义一个字段的时候直接在后面进行设置primary key
    10. 例如: create table test2(
    11. id int(10) unsigned not null primary key,
    12. name char(20) not null default ''
    13. );
    14. (2)定义完字段后再定义主键
    15. 例如: create table test3(
    16. id int(10) unsigned not null,
    17. name char(20) not null default '',
    18. primary key (id)
    19. );
    20. 唯一键:unique key 解决表中多个字段需要唯一性约束的问题.
    21. 例如:create table test4(
    22. id int(10) unsigned not null,
    23. name char(20) not null default '',
    24. goods varchar(100) not null default '',
    25. primary key (id),
    26. unique key (name,goods)
    27. );

    26.自增长
    代码如下(示例):

    1. /*自动增长: auto_increment*/
    2. 自增长属性:每次插入记录的时候,自动的为某个字段的值加1(基于上一个记录). 通常跟主键搭配.
    3. 自增长规则:(1)任何一个字段要做自增长前提必须是一个索引 (2)自增长字段必须是整型数字
    4. 例如: create table test5(
    5. id int(10) unsigned not null auto_increment,
    6. name char(20) not null default '',
    7. primary key (id)
    8. );

    27.列描述
    代码如下(示例):

    1. /*列描述 comment*/
    2. 列描述(注释):comment 与其他的注释符不同之处在于,这里的注释内容属于列定义的一部分.
    3. 例如:create table user(
    4. id int(10) unsigned not null auto_increment comment 'id',
    5. name char(20) not null default '' comment '名字',
    6. primary key (id)
    7. )engine=InnoDB default charset=utf8 comment='用户表';

    28.索引
    代码如下(示例):

    1. #索引
    2. /*索引的概述和优缺点和种类*/
    3. 什么是索引?
    4. 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.
    5. 类比理解:数据库中的索引相当于书籍目录一样,能加快数据库的查询速度.
    6. 没有索引的情况,数据库会遍历全部数据后选择符合条件的选项.
    7. 创建相应的索引,数据库会直接在索引中查找符合条件的选项.
    8. 索引的性质分类:
    9. 索引分为聚集索引和非聚集索引两种,聚集索引是索引中键值的逻辑顺序决定了表中相应行的物理顺序,而非聚集索引是不一样;
    10. 聚集索引能提高多行检索的速度,而非聚集索引对于单行的检索很快.
    11. 索引的优点:
    12. (1)加快数据检索速度 (创建索引主要原因)
    13. (2)创建唯一性索引,保证数据库表中每一行数据的唯一性
    14. (3)加速表和表之间的连接
    15. (4)使用分组和排序子句对数据检索时,减少检索时间
    16. (5)使用索引在查询的过程中,使用优化隐藏器,提高系统的性能
    17. 索引的缺点:
    18. (1)创建索引和维护索引要耗费时间,时间随着数据量的增加而增加
    19. (2)索引需要占用物理空间和数据空间
    20. (3)表中的数据操作插入、删除、修改, 维护数据速度下降
    21. 索引种类
    22. (1)普通索引: 仅加速查询
    23. (2)唯一索引: 加速查询 + 列值唯一(可以有null
    24. (3)主键索引: 加速查询 + 列值唯一(不可以有null+ 表中只有一个
    25. (4)组合索引: 多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
    26. (5)全文索引: 对文本的内容进行分词,进行搜索 (注意:目前仅有MyISAM引擎支持)
    27. /*创建表时直接指定索引*/
    28. --创建主键索引
    29. 例如:create table student(
    30. id int(10) unsigned not null auto_increment comment 'id主键索引',
    31. name char(20) not null default '' comment '名字',
    32. class varchar(50) not null default '' comment '班级',
    33. seat_number smallint(5) not null default 0 comment '座位编号',
    34. primary key (id)
    35. )engine=InnoDB default charset=utf8 comment='学生表';
    36. /*创建索引*/
    37. create [unique唯一索引][clustered聚集索引] index <索引名>
    38. on <表名>(<列名称>[<排序>],<列名称>[<排序>]…);
    39. 语法解析:其中unique和clustered为可选项. 注意:基本表上最多仅仅能建立一个聚集索引.
    40. "列名称":规定需要索引的列. "排序":可选asc(升序)和desc(降序)缺省值为asc.
    41. --创建唯一索引(unique key 简写 unique)
    42. 例如:create unique index number on student(seat_number desc);
    43. --创建普通索引
    44. 例如:create index name_class on student(name asc,class desc);
    45. /*删除索引*/
    46. drop index <索引名> on 表名;
    47. 例如:drop index number on student;

    29.外键
    代码如下(示例):

    1. /*外键约束: foreign key */
    2. 外键约束: foreign key 被约束的表叫做副表,外键设置在副表上面,外键引用主键字段所在的表叫做主表. (作用:约束两张表的数据)
    3. 外键定义语法: constraint 外键约束名称 foreign key(外键字段) references 主表名称(引用字段)
    4. 外键数据操作:
    5. 1.当有外键约束之后,添加数据的时候,先添加主表数据,再添加副表数据
    6. 2.当有了外键约束,修改数据的时候,先改副表的数据,在修改主表的数据
    7. 3.当有了外键约束,删除数据的时候,也是先删除副表的数据,再删除主表的数据
    8. 外键注意事项:
    9. 1.外键约束只有InnoDB存储引擎才支持.
    10. 2.实际项目中往往会用到外键的设计思想,但往往不会真正的从语法上进行外键约束. 因为外键约束的级联操作可能会带来一些现实的逻辑问题. 另外使用外键会较低mysql的效率.

    30.储存引擎
    代码如下(示例):

    1. /*储存引擎: engine*/
    2. 常见的引擎:Myisam InnoDB BDB Memory Archive 等
    3. 不同的引擎在保存表的结构和数据时采用不同的方式?
    4. MyISAM表文件含义:.frm表定义,.MYD表数据,.MYI表索引
    5. InnoDB表文件含义:.frm表定义,表数据空间文件(存放表的数据和索引)和日志文件

    31.MySQL中innodb与myisam的区别
    代码如下(示例):

    1. MySQL中innodb与myisam的区别
    2. (1):InnoDB支持事物,MyISAM不支持事物
    3. (2):InnoDB支持行级锁,MyISAM支持表级锁
    4. (3):InnoDB支持快照数据(MVCC),MyISAM不支持
    5. (4):InnoDB支持外键,MyISAM不支持
    6. (5):InnoDB不支持全文索引,MyISAM支持
    7. innodb使用的是行级锁:只有在增删改查时匹配的条件字段带有索引时,innodb才会使用行级锁.(行级锁:要为匹配条件字段加索引)
    8. innodb使用的是表级锁:如果增删改查时匹配的条件字段不带有索引时,innodb使用的将是表级锁.(表级锁:数据库全表查询,需要将整张表加锁,保证查询匹配的正确性)
    9. 触发读锁:就是用select命令时触发读锁.
    10. 触发写锁:就是在你使用update,delete,insert时触发写锁,并且使用rollbackcommit后解除本次锁定
    11. 更好的区分:读写锁和表级锁行级锁. 将读写锁叫做权限锁(决定了加锁后用户有哪些操作权限),将表级锁行级锁叫做对象锁(决定将锁加在某一行还是整张表)
    12. MVCC多版本并发控制,也可称之为一致性非锁定读;它通过行的多版本控制方式来读取当前执行时间数据库中的行数据. 实质上使用的是快照数据.
    13. 为什么要使用MVCC?
    14. 消除锁的开销. (如果要保证数据的一致性,最简单的方式就是对操作数据进行加锁,但是加锁不可避免的会有锁开销. 所以使用MVCC能避免进行加锁的方式并提高并发.)

    32.三范式
    代码如下(示例):

    1. /*数据库三范式*/
    2. --建表规范
    3. - 每个表保存一个实体信息
    4. - 每个具有一个ID字段作为主键
    5. - ID主键 + 原子表
    6. --第一范式
    7. 字段不能再分,确保每列保持原子性.
    8. --第二范式
    9. 满足第一范式的基础上,不能有部分依赖.
    10. 消除符合组合主键(A,B)就可以避免部分依赖. 增加单列关键字.
    11. --第三范式
    12. 满足第二范式的基础上,不能有传递依赖.
    13. 某个字段依赖于主键,而有其他字段依赖于该字段. 这就是传递依赖.
    14. 将一个实体信息的数据放在一个表内实现

    33.比较运算符和逻辑运算符
    代码如下(示例):

    1. --比较运算符(常用示例)
    2. <, >, <=, >=, =, !=<>, IS NULL
    3. between and | not between and --例如: between A and B; 相当于区间[A,B].
    4. in | not in --例如:in表示某个值出现; not in表示没出现在一个集合之中.
    5. is null | is not null --空值查询
    6. like --通配符; _ :代表任意的单个字符; % :代表任意的字符
    7. --逻辑运算符
    8. &&(AND), ||(OR), !(NOT), XOR异或

    34.group by
    代码如下(示例):

    1. --group by子句 (分组)
    2. --group by 字段/别名 [排序方式] 分组后排序: asc 升序(默认),desc 降序
    3. --统计函数需配合group by使用:
    4. count 返回不同的非NULL统计值 count(*)、count(字段)
    5. sum 求和; max 求最大值; min 求最小值; avg 求平均值
    6. select class, sum(score) as sum from student group by class desc;--查询各个班级总成绩,分组班级降序.
    7. select id,class, max(score) as max from student where score>80 group by class;--查询各个班级最高成绩,分数要大于80,分组班级升序.

    35.having
    代码如下(示例):

    1. --having 子句 (条件查询)
    2. --where功能、用法相同,执行时机不同.
    3. --本质区别:where子句是把磁盘上的数据筛选到内存上,而having子句是把内存中的数据再次进行筛选.
    4. --where不可以使用统计函数. 一般需用统计函数配合group by才会用到having
    5. 例如:select class, min(score) as min from student where min(score)>80 group by class;--报错
    6. select class, min(score) as min from student group by class having min(score)>80;--查询各个班级最低成绩,分组班级,最低分数大于80

    36.order by
    代码如下(示例):

    1. --order by子句 (排序)
    2. --order by 字段1[asc|desc],字段n[asc|desc]
    3. --排序: asc 升序(默认),desc 降序
    4. 例如:insert into student(name,score,class) values('xiaohu',95,'A');--插入相同班级相同分数,要求多字段排序?
    5. select * from student where score >80 order by score,name desc;--查询score大于80,排序score升序和name降序

    37.联合查询
    代码如下(示例):

    1. /*联合查询 关键字:union*/
    2. --联合查询:就是将多个查询结果进行纵向上的拼接. (select语句2的查询结果放在select语句1查询结果的后面)
    3. --语法:
    4. select语句1
    5. union [all | distinct]
    6. select 语句2
    7. union [all | distinct]
    8. select 语句n
    9. 例如:查询A班级最高成绩和B班级最低成绩?
    10. (select name, class,score from student where class='A' order by score desc limit 1)
    11. union
    12. (select name, class,score from student where class='B' order by score limit 1);

    38.连接查询
    代码如下(示例):

    1. /*连接查询*/
    2. 将多个表的字段进行连接,可以指定连接条件.
    3. --交叉连接 cross join
    4. select *|字段列表 from 表名1 cross join 表名2;
    5. 一张表的一条记录去连接另一张表中的所有记录,并且保存所有的记录包含两个表的所有的字段.
    6. 结果上看,就是对两张表做笛卡尔积,有n1*n2条记录.
    7. 例如:select * from student cross join score;

    39.内连接
    代码如下(示例):

    1. --内连接 inner join
    2. select *|字段列表 from 左表 [inner] join 右表 on 左表.字段 = 右表.字段 [五子句];
    3. 数据在左表中存在,同时在右表中又有对应的匹配的结果才会被保存. 如果没有匹配上,数据没有意义不会保存.
    4. 通常就是两张表中存在相同的某个字段.(项目中通常是关联主键ID) using() 用法连接两表公共字段. 例如:using(ID)
    5. select student.*, teacher.class as t_class, teacher.name as t_name from student join teacher on student.class = teacher.class;

    40.外连接
    代码如下(示例):

    1. --外连接外 outer join
    2. 如果数据不存在,也会出现在连接结果中.
    3. -- 左外连接 left join
    4. select *|字段列表 from 左表 left [outer] join 右表 on 左表.字段 = 右表.字段 [五子句];
    5. 如果数据不存在,左表记录会出现,而右表为null填充
    6. 例如:select student.*, teacher.class as t_class, teacher.name as t_name from student left join teacher on student.class = teacher.class;

    41.右连接
    代码如下(示例):

    1. -- 右外连接 right join
    2. select *|字段列表 from 右表 right [outer] join 左表 on 右表.字段 = 左表.字段 [五子句];
    3. 如果数据不存在,右表记录会出现,而左表为null填充
    4. --自然连接 natural join
    5. 自动判断连接条件完成连接.
    6. --自然内连接 natural inner join
    7. select *|字段列表 from 左表 natural [inner] join 右表;
    8. 自然内连接其实就是内连接,这里的匹配条件是由系统自动指定.
    9. --自然外连接 natural outer join
    10. 自然外连接分为自然左外连接和自然右外连接.匹配条件也是由系统自动指定.
    11. --自然左外连接 natural left join
    12. select *|字段列表 from 左表 natural left [outer] join 右表;
    13. --自然右外连接 natural right join
    14. select *|字段列表 from 右表 natural right [outer] join 左表;

    注意:项目中使用最多是内连接和外连接.

    42.子查询
    代码如下(示例):

    1. /*子查询*/
    2. 子查询(内查询)在主查询(外查询)之前一次执行完成,子查询的结果被主查询使用.
    3. 使用子查询需用括号包裹.
    4. select * from student where score=(select max(score) as max from student);--查询班级最高成绩学生的记录
    5. 根据子查询返回值的形式:
    6. 1.单一值: 返回单行单列的子查询,也叫标量子查询.
    7. 例如:select max(score) as max from student;

    43.exists
    代码如下(示例):

    1. --exists
    2. --主要作用就是判断后面的select语句有没有查询到数据.结果为true有返回数据,否则就是false.
    3. 例如:select exists (select * from student where name ='uzi');--有

    44.视图
    代码如下(示例):

    1. /*视图*/
    2. 视图是一张虚拟表,它表示一张表的部分数据和多张表的综合数据,视图的结构和数据都是建立在基表上.
    3. 视图仅仅是一个表结构,视图的数据并不在数据库中存储,数据保存在基表中. 一张表可以创建多个视图.
    4. -- 视图作用
    5. 简化业务逻辑,对客户端隐藏真实的表结构
    6. --创建视图
    7. create [algorithm = undefined | merge | temptable] view 视图名称 [(字段列表)]
    8. as
    9. sql语句
    10. 语法解析:
    11. 1.视图名必须唯一,同时不能与表重名.
    12. 2.指定视图执行的算法,通过algorithm指定.
    13. 3.merge: 合并算法,将视图的语句和外层的语句合并后再执行.
    14. 4.temptable: 临时表算法,将视图执行的结果生成一张临时表,再执行外层语句.
    15. 5.undefined: 未定义型,用哪种算法有MySQL决定,默认算法merge.
    16. 6."字段列表"如果存在,数目必须等于select语句检索的列数
    17. 例如:create view v_student (v_name,v_score)
    18. as
    19. select name,score from student where score >80;
    20. --查看结构
    21. show create view 视图名称
    22. --删除视图
    23. drop view [if exists] 视图名称
    24. 注意: 删除视图后,数据库中的数据依然存在.(对当前视图删除)
    25. --修改视图结构
    26. alter view 视图名称 [(字段列表)]
    27. as
    28. sql语句

    45.事物
    代码如下(示例):

    1. /*事物*/
    2. 事物:是并发控制的基本单位.事务就是一系列的操作,这些操作要么都执行,要么都不执行.(事务中可以保存多个SQL语句. 这些SQL语句是一个整体. 要么都执行,要么都不执行.)
    3. --事务操作
    4. --开启事务
    5. start transaction; 或者 begin;
    6. --提交事务
    7. commit;
    8. --回滚事务
    9. rollback;
    10. --group by子句 (分组)
    11. --group by 字段/别名 [排序方式] 分组后排序: asc 升序(默认),desc 降序
    12. --统计函数需配合group by使用:
    13. count 返回不同的非NULL统计值 count(*)、count(字段)
    14. sum 求和; max 求最大值; min 求最小值; avg 求平均值
    15. start transaction;--开启事物
    16. insert into goods(goods_name,price) values('milk','43');
    17. insert into goods(goods_name,price) values('bread','15');
    18. commit;--提交事物
    19. begin;--开启事物
    20. insert into goods(goods_name,price) values('book','99');
    21. rollback;--回滚事物

    – 事务的特性

    原子性: 事务是一个不可分割的工作单位,事务中的操作要么都执行,要么都不执行.
    一致性: 事务前后数据的完整性必须保持一致. (事务开始和结束时,外部数据一致. 在整个事务过程中,操作是连续的.)
    隔离性: 多个用户并发访问数据库时,一个用户的事务不能被其它用户的事物所干扰,多个并发事务之间的数据要相互隔离.
    持久性: 一个事务一旦被提交,它对数据库中的数据改变就是永久性的.
    – 事务的原理
    利用InnoDB的自动提交(autocommit)特性完成. 普通的Mysql执行语句后,当前的数据提交操作均可被其它客户端可见.
    事务是暂时关闭“自动提交”机制,需要commit提交持久化数据操作.

    注意: 修改事务自动提交 set autocommit = 0 | 1 (0:取消自动提交;1:自动提交)--设置为不自动提交,因为Mysql默认自动提交执行

    46.用户权限管理
    代码如下(示例):

    1. /*用户权限管理*/
    2. 用户信息表:mysql数据库的下, user表中
    3. --创建用户
    4. create user 用户名[@主机地址] identified by '密码';
    5. 例如:create user 'user_one'@'localhost' identified by '1234';--创建一个只能本机访问的用户
    6. create user 'user_two'@'192.168.1.204.%' identified by '1234';--创建一个可以局域网访问的用户
    7. create user 'user_three' identified by '1234';--创建一个可全网访问的用户
    8. select host,user,password from user;--查看user表,host用户名和密码
    9. --重命名用户
    10. rename user 老用户名[@老主机地址] to 新用户名[@新主机地址];
    11. -- 设置密码
    12. set password = password('修改密码'); -- 为当前用户设置密码
    13. set password for 用户名 = password('修改密码'); -- 为指定用户设置密码
    14. 例如:set password for 'user_three' = password('123456789'); -- 指定'user_three'用户设置密码
    15. -- 删除用户
    16. drop user 用户名[@主机地址];
    17. 例如:drop user 'user_two'@'192.168.1.204.%';
    18. --分配权限给用户
    19. grant 权限列表 on *|库名 . *|表名 to 用户名[@主机地址] [identified by "用户密码"] [with grant option];
    20. 语法解析:
    21. 权限列表: all [privileges]: 表示所有权限; delete:允许使用delete; select:允许使用select; update:允许使用update; insert:允许使用insert 等...
    22. *.* :表示所有库的所有表
    23. 库名.表名 :表示某库下面的某表
    24. 例如: grant update,insert on *.* to user_one@'localhost' identified by "1234" with grant option;
    25. --刷新权限
    26. flush privileges;
    27. --查看权限
    28. show grants for 用户名[@主机地址];
    29. show grants for 'user_one'@'localhost';
    30. --查看当前用户权限
    31. show grants;
    32. --撤消权限
    33. revoke 权限列表 on *|库名 . *|表名 from 用户名[@主机地址];
    34. revoke all privileges, grant option from 用户名[@主机地址];-- 撤销所有权限
    35. 例如:revoke update on *.* from 'user_one'@'localhost';
  • 相关阅读:
    嵌入式学习笔记(46) NandFlash的结构
    中信建投:商汤科技:大模型+大装置”逐浪AGI,四大板块持续升级
    数据指标体系建设思考(二)
    班级校园网页设计作业 静态HTML我的班级网页 DW班级网站模板下载 大学生简单班级网页作品代码 我的大学网页制作 学生班级网页设计作业
    Ubuntu Budgie 22.04 设置中文语言并安装拼音输入法
    Radis基础命令(String类型)Value为JSON
    基础算法优化——Fast Modular Multiplication
    如何对振弦式渗压计进行数据读取和处理
    时钟树综合(一)
    【flink】Task 故障恢复详解以及各重启策略适用场景说明
  • 原文地址:https://blog.csdn.net/dongjing991/article/details/133681264