数据表高级操作

准备工作:

create database CLASS;
use CLASS;

create table TEST (id int not null,name char(20) not null,cardid varchar(18) not null unique key,primary key (id));

insert into TEST(id,name,cardid) values (1,'zhangsan','123123');

insert into TEST(id,name,cardid) values (2,'lisi','1231231');

insert into TEST(id,name,cardid) values (3,'wangwu','12312312');
select * from TEST;

Mysql 数据库之高级操作_数据库用户管理1.克隆表,将数据表的数据记录生成到新的表中

方法一:
create table test01 like ky08; #通过like方法,复制ky08表结构生成test01
insert into test01 select * from ky08;

方法二:
create table test02 (select * from ky08) ;

show create table test02\G #获取数据表的表结构、索引等信息
select * from test02;

CREATE TABLE 新表 (SELECT * FROM 旧表)
这种方法会将oldtable中所有的内容都拷贝过来不过这种方法的一个最不好的地方就是新表中没有了旧表的primary key、Extra(auto_increment)等属性。

Mysql 数据库之高级操作_外键约束_02

Mysql 数据库之高级操作_用户授权_03

2.清空表,删除表内的所有数据

delete from test01;
#delete清空表后,返回的结果内有删除的记录条目;delete工作时是一行一行的删除记
录数据的;如果表中有自增长字段,使用delete from删除所有记录后,再次新添加的记
录会从原来最大的记录id 后面继续自增写入记录。

truncate table test01;
#truncate清空表后,没有返回被删除的条目: truncate 工作时是将表结构按原样重新
建立,因此在速度上truncate会比delete清空表快;使用truncate table清空表内数
据后,id会从1开始重新记录。

Mysql 数据库之高级操作_临时表_04

Mysql 数据库之高级操作_外键约束_05

3.创建临时表

    ​临时表创建成功之后,使用show tables命令是看不到创建的临时表的,临时表会在连接退出后被销毁。

    ​如果在退出连接之前,也可以可执行增删改查等操作,比如使用drop table语句手动直接删除临时表。

create temporary table 表名(字段1 数据类型,字段2 数据类型[,...][,primary key (主键名)]);

:
create temporary table test03(id int(4) zerofill primary key auto_increment,name varchar(10) not null,cardid int (18) not null unique key,hobby varchar (50));

insert into test03 values (1,'zhangsan',123456,'running');

select * from test03;
show tables;

quit
select * from test03;

Mysql 数据库之高级操作_数据库用户管理_06

Mysql 数据库之高级操作_临时表_07

4.创建外键约束,保证数据的完整性和一致性 。

外键的定义:如果同一个属性字段x在表一中是主键,而在表二中不是主键,则字段x称为表二的外键。

主键表和外键表的理解:

(1)以公共关键字作主键的表为主键表(父表、主表)
(2)以公共关键字作外键的表为外键表(从表、外表)

注意:与外键关联的主表的字段必须设置为主键。要求从表不能是临时表,主从表的字段具
备相同的数据类型、字符长度和约束。

#创建主表profession
create table profession (pid int(4) , proname varchar (50)) ;

#创建从表student
create table student (id int(4) primary key auto_increment,name varchar(10),age int(3) ,proid int(4));

#为主表profession 添加一个主键约束。主键名建议以“PK_”开头。
alter table profession add constraint PK_pid primary key (pid) ;

#为从表student 表添加外键,并将student 表的proid 字段和profession 表的pid 字段建立外键关联。外键名建议以“FK_”开头。
alter table student add constraint FK_pro foreign key (proid) references profession (pid) ;

desc student;

Mysql 数据库之高级操作_用户授权_08

创建外键约束后操作示例:

例:添加数据记录
insert into TEST05 values (1,'zhangsan','20',1);
insert into TEST04 values (1,'sleep');
insert into TEST05 values (1,'zhangsan',20,1);

:删除表格
drop table TEST04;
drop table TEST05;
drop table TEST04;

Mysql 数据库之高级操作_用户授权_09

Mysql 数据库之高级操作_临时表_10

#查看和删除外键约束:

show create table student ;
desc student;
alter table student drop foreign key FK_pro;
alter table student drop key FK_pro;

MySQL中6种常见的约束:

主键约束(primary key)
外键约束( foreign key)
非空约束(not null )
唯一性约束(unique [key | index] )
默认值约束(default )
自增约束(auto_increment)

数据库用户管理

1.新建用户

create user '用户名'@'来源地址' [identified by [password] '密码'];

'用户名' : 指定将创建的用户名.
'来源地址' : 指定新创建的用户可在哪些主机上登录,可使用ip地址、网段、主机名的形式,本地用户可用localhost, 允许任意主机登录可用通配符%
'密码' : 若使用明文密码,直接输入'密码' 插入到数据库时由mysql 自动加密;
若使用加密密码,需要先使用select password(' 密码');获取密文,再在语句中添加password '密文';
若省略“identified by" 部分,则用户的密码将为空(不建议使用)

create user 'user1'@'localhost' identified by '123456';

select password('abc123') ;
create user 'user2'@'localhost' identified by password '*6bb4837eb74329105ee4568dda7dc67ed2ca2ad9';

Mysql 数据库之高级操作_用户授权_11

2.查看用户信息

#创建后的用户保存在mysql数据库的user 表里
use mysql;
select user,authentication_string,host from user;

Mysql 数据库之高级操作_用户授权_12

3.重命名用户

rename user 'zhangsan'@'localhost' TO 'wangwu'@'localhost';
select user,authentication_string,Host from user;

Mysql 数据库之高级操作_临时表_13

4.删除用户

drop user 'lisi'@'localhost';
select user,authentication_string,Host from user;

Mysql 数据库之高级操作_用户授权_14

5.修改当前登录用户密码

SET PASSWORD = PASSWORD('abc123');
quit
mysql -u root -p

Mysql 数据库之高级操作_临时表_15

6.修改其他用户密码

set password for 'wangwu'@'localhost' = password('abc123');
use mysql;
select user,authentication_string,Host from user;

Mysql 数据库之高级操作_外键约束_16

7.忘记 root 密码的解决办法

1、修改 /etc/my.cnf 配置文件,不使用密码直接登录到 mysql
vim /etc/my.cnf
[mysqld]
skip-grant-tables #添加,使登录mysql不使用授权表

systemctl restart mysqld.service

mysql #直接登录

2.使用 update 修改 root 密码,刷新数据库
UPDATE mysql.user SET AUTHENTICATION_STRING = PASSWORD('112233') where user='root';
FLUSH PRIVILEGES;
quit

再把 /etc/my.cnf 配置文件里的 skip-grant-tables 删除,并重启 mysql 服务。
mysql -u root -p
112233

Mysql 数据库之高级操作_临时表_17

Mysql 数据库之高级操作_用户授权_18

Mysql 数据库之高级操作_外键约束_19

Mysql 数据库之高级操作_数据库用户管理_20

数据库用户授权

1.授予权限

grant语句:专门用来设置数据库用户的访问权限。
当指定的用户名不存在时,grant语句将会创建新的用户;
当指定的用户名存在时,grant语句用于修改用户信息。

格式:
grant 权限列表 on 数据库名.表名 to '用户名'@'来源地址' [identified by '密码'];

#权限列表:用于列出授权使用的各种数据库操作,以逗号进行分隔,如"select, insert, update"
使用"all"表示所有权限,可授权执行任何操作。

#数据库名.表名:用于指定授权操作的数据库和表的名称,其中可以使用通配符“*”。
例如,使用 "kgc.*" 表示授权操作的对象为kgc数据库中的所有表。

#'用户名@来源地址':用于指定用户名称和允许访问的客户机地址,即谁能连接、能从哪里连接。
来源地址可以是域名、ip地址,还可以使用 "%" 通配符,表示某个区域或网段内的所有地址,如"8.kgc.com""192.168.80.8"等。

#identified by:用于设置用户连接数据库时所使用的密码字符串。
在新建用户时,若省略"identified by" 部分,则用户的密码将为空。

案例:
#允许用户zhangsan在本地查询kgc数据库中所有表的数据记录,但禁止查询其他数据库中的表的记录。
grant select on kgc.* to 'zhangsan'@'localhost' identified by '123456';

#允许用户lisi 在所有终端远程连接mysql ,并拥有所有权限。
grant all [privileges] on *.* to 'lisi'@'%' identified by '123456';

flush privileges;
quit

mysql -u zhangsan -p123456
usekgc;
show tables;
select * from KY08;

2.查看权限

show grants for 用户名@来源地址;

:
show grants for 'lisi'@'8' ;

3.撤销权限

格式:
revoke 权限列表 on 数据库名.表名 from 用户名@来源地址;

:
revoke all on *.* from 'lisi'@'g';

show grants for 'lisi'@'g' ;
#usage权限只能用于数据库登陆,不能执行任何操作;
usage权限不能被回收,即revoke不能删除用户。

flush privileges;