1) 确保表里的字段都缺一不可(也就是具有原子性)
2) 确保表里的字段都和主键直接相关
[内容] MariaDB & MySQL 事务
内容一:事务的作用
事务的作用是保护数据的安全性
内容二:MariaDB & MySQL 事务的 4 大特性
2.1 原子性(Atomicity)
一系列操作被看作一个事务,这个事务里面的所有操作要么全部失败,要么全部成功,如果在操作的过程中出现中断,则立刻进行 rollback
2.2 一致性(Consistency)
一系列操作被看作一个事务,在事务开始前和结束后,整个库的完整逻辑约束不能被打破,例如:一个人向另一个人转账,不能出现一个人转账成功另一个人没有收到转账,或者一个人转账失败另一个人收到转账的情况
2.3 隔离性(Isolation)
主要解决并发的情况,避免不同的人,在相同的时间,查看到的数据的不一致性,避免以下情况的发生:
1) 脏读:一个事务读取了另一个事务更新、提交并撤销的数据,导致此事务看到的数据是错误的
2) 不可重复读:一个事务多次读取了另一个事务多次更新并提交的数据,导致此事务看到的数据是来回变化的
3) 幻读:一个事务在批量修改所有数据,但是在修改的过程中另一个事务又往里面插入了数据,导致此事务在修改完成之后,意外发现还有一条数据没有修改
2.4 持久性(Durability)
事务结束后,所有更新都将被保存,不能回滚
内容三:MariaDB & MySQL 事务隔离级别
3.1 MariaDB & MySQL 事务隔离级别的特点
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交(read-uncommitted) | 是 | 是 | 是 |
不可重复读(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
3.2 MariaDB & MySQL 默认的事务隔离级别
可重复读 repeatable-read
3.3 查看目前所使用的事务隔离的方法
MariaDB [(none)]> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.001 sec)
(补充:这里以查看 MariaDB 目前所使用的事务隔离为例)
[内容] MariaDB & MySQL 多表关系
内容一:一对一关系
1.1 通常实现方法
唯一外键
1.2 典型案例
学生表和学生证表
内容二:一对多关系
2.1 通常实现方法
主外键
2.2 典型案例
学生表和班级表
内容三:多对多关系
3.1 通常实现方法
中间表加联合主键
(补充:联合主键是指一张表中有两个主键,这两个主键叫联合主键,每一条数据里的联合主键可以相互之间拼凑成一个新的主键,联合主键可以重复,只要保证这个新的主键唯一即可)
3.2 典型案例
学生和课程
[SQL] MariaDB & MySQL 索引的设置 (转载)
mysql 设置索引
1.添加PRIMARY KEY(主键索引)
语法:ALTER TABLE `表名` ADD PRIMARY KEY ( `列名称` )
mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
2.添加UNIQUE(唯一索引)
语法:ALTER TABLE `表名` ADD UNIQUE ( `列名称`)
mysql>ALTER TABLE `table_name` ADD UNIQUE ( `column`)
3.添加INDEX(普通索引)
语法:ALTER TABLE `表名` ADD INDEX index_name ( `列名称` )
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
4.添加FULLTEXT(全文索引)
语法:ALTER TABLE `表名` ADD FULLTEXT ( `列名称`)
mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
5.添加多列索引
语法:ALTER TABLE `表名` ADD INDEX index_name ( `列名称`, `列名称`, `列名称` )
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
想要查看表有几个字段设置了索引
语法;SHOW INDEX FROM `表名`
mysql>SHOW INDEX FROM `cccinfo`
————————————————
版权声明:本文为CSDN博主「z793397795」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/z793397795/article/details/91491546
注明:所有转载内容皆直接从被转载文章网页的标题和内容的文本中复制而来
[SQL] MariaDB & MySQL 用户和权限的管理 (转载)
MySQL用户管理和权限管理
在项目中,一个数据库有很多人需要使用,不能所有的人都使用相同的权限,如果人比较多,一人一个用户也很难管理。一般来说,会分超级管理员权限,管理员权限,读写权限,只读权限等,这样方便管理。当然,具体怎么管理权限根据实际情况来确定。
无论如何,都需要创建多个用户来管理权限。
root 是数据库的超级管理员用户,对于普通开发人员来说,权限太大了,如果不小心做了一些不可逆的操作,后果是非常严重的,并且还不容易查出责任人。
所以 root 用户不会让开发人员使用,一般会由 DBA 或运维人员统一管理,如果没有 DBA,统一由超级管理员 root 来分配。
1. 查看所有用户
MySQL 中所有的用户及权限信息都存储在默认数据库 mysql 的 user 表中。
进入 mysql 数据库,通过 desc user; 可以查看 user 表的结构。
use mysql;
desc user;
可以看到 user 中有40多个字段,字段非常多,只要关注主要字段就行了。
其中的主要字段有:
host: 允许访问的主机地址,localhost 为本机,% 为任何主机。
user: 用户名。
authentication_string: 加密后的密码值。
使用 select * from user; 查看 user 表中当前有哪些用户。
select host,user,authentication_string from user;
在安装 MySQL 后,有三个默认的用户。
2. 创建用户
使用 create user '用户名'@'访问主机' identified by '密码'; 创建用户。
create user 'admin'@'localhost' identified by 'Mysql!123';
创建用户后,查看用户,多了刚才创建的 admin,创建成功。
3. 查看用户权限
使用 show grants for '用户名'@'访问主机'; 查看用户的权限。
show grants for 'admin'@'localhost';
在创建用户的时候,如果没有指定权限,默认会赋予 USAGE 权限,这个权限很小,几乎为0,只有连接数据库和查询information_schema 数据库的权限。虽然 *.* 表示所有数据库的所有表,但因为 USAGE 的限制,不能操作所有数据库。
退出 root 用户,登录到 admin 用户,只能看到 information_schema 数据库。
4. 给用户授权
创建 admin 用户,目的是创建一个管理员,所以要给 admin 授权。退出 admin ,重新登录 root 。
在授权时,常用的权限有 CREATE、ALTER、DROP、INSERT、UPDATE、DELETE、SELECT,ALL PRIVILEGES 表示所有权限。
通过 数据库.数据表 指定对哪个数据库的哪个表授权,*.* 表示所有数据库中的所有表。
通过 '用户名'@'访问主机' 来表示用户可以从哪些主机登录, ‘%’ 表示可以从任何主机登录。
使用 grant 权限 on 数据库.数据表 to '用户名'@'访问主机' identified by '密码'; 来给数据库用户授权。
grant all privileges on *.* to 'admin'@'localhost' identified by 'Mysql!123';
给 admin 用户授权后,权限从 USAGE 变成了 ALL PRIVILEGES ,表示 admin 拥有了所有权限。
如果授权没有生效,记得刷新一下权限,使权限生效。
flush privileges;
再重新登陆到 admin 用户上,可以操作所有数据库了。
给用户授权的时候,必须要指定 '用户名'@'访问主机' 来指定用户。如果 '访问主机' 不相同,不是给用户授权,而是创建一个同名同密码的用户,这个用户与原用户可以登陆的主机不相同,权限不同。
grant all privileges on *.* to 'admin'@'%' identified by 'Mysql!123';
执行上面的语句后,user 表中有两个 admin 用户,用户名和密码都一样,但可以登陆的主机不一样。第一次创建的 admin 访问主机是 localhost,执行上面的语句时指定的访问主机是 % ,访问主机不一样,MySQL 会创建两个用户。虽然用户名密码相同,但这是两个不同的用户,两个用户的权限不一样。给两个用户指定不同的权限,在两个用户都有权限的主机登录时,局部用户的权限会覆盖全局用户的权限,当在 localhost 登录时,'admin'@'localhost' 的权限会覆盖 'admin'@'%' 的权限。
对于可以从任何主机登录的用户,在查看用户权限时,可以使用 show grants for 用户名; 来查看权限,指定主机的用户在查看权限时,要跟上访问主机才能查看权限。
5. 创建用户并授权
使用 grant 权限 on 数据库.数据表 to '用户名'@'访问主机' identified by '密码'; 来创建一个用户并指定权限,与上面授权使用的语句相同。
grant create,select on *.* to 'creater'@'%' identified by 'Mysql!123';
创建了一个有读写权限的用户 creater,这个用户拥有所有数据库的 SELECT 和 CREATE 权限,可以从任何主机登录数据库。
6. 修改用户的权限
使用 grant 权限 on 数据库.数据表 to '用户名'@'访问主机' identified by '密码'; 修改用户的权限,其实前面的授权就是修改权限。
grant all privileges on *.* to 'creater'@'%' identified by 'Mysql!123';
修改用户的权限后,creater 的权限从 SELECT 和 CREATE 权限变成了 ALL PRIVILEGES。
7. 删除用户
使用 drop user '用户名'@'访问主机'; 来删除用户。
drop user 'admin'@'localhost';
执行删除操作后,user 表中不再有该用户。
8. 修改用户名和访问主机
使用 rename user '用户名'@'访问主机' to '新用户名'@'新访问主机'; 来修改用户名和用户的访问主机。
rename user 'creater'@'%' to 'create'@'localhost';
修改之后,creater 用户改名 create ,访问主机从 % 变成了 localhost 。
9. 修改用户密码
使用 set password for '用户名'@'访问主机' = password('新密码'); 修改用户的密码。
set password for 'create'@'localhost'=password('Mysql@123');
上面创建的 admin 用户和 create 用户密码相同,现在给 create 修改密码,使密码不一样。
以上就是对数据库用户和权限管理的基本操作。这些操作都是对 mysql 数据库中的 user 表进行操作,所以上面的大部分操作都还有另外一种方法,就是通过对 mysql.user 表的增删改查语句来实现。
————————————————
版权声明:本文为CSDN博主「Python碎片」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43790276/article/details/102674936
注明:所有转载内容皆直接从被转载文章网页的标题和内容的文本中复制而来