Mysql中 约束 范式 以及DCL用户的管理授权

        show databases;
        use db;
        show tables;
        select * from stu;
        -- 约束 : 主键约束 primary key   非空且唯一
        -- 非空约束 not null  
        -- 唯一约束 unique 
         -- 外键约束 foreign key
        create table stu2 (id int primary key, name varchar(20) not null,address varchar(77));
        select * from stu2;
        insert into stu2 values ( 1, "liang","biejing");
        -- 修改表中的约束
        alter table stu2 modify address varchar(20) unique;
        select * from stu2;
        insert into stu2 values (2,"shu","beijing");
        select * from  stu2;
        insert into stu2 values (3,"cheng", "shanghai");
        select * from  stu2;
        -- 删除 唯一约束 不能使用modify
        alter table stu2 drop  index address;
        -- 再创建表之后添加唯一约束alter
        alter table stu2 modify address varchar(20) unique;
        -- 删除主键
        alter table stu2 drop primary key ;
        -- 在创建表之后添加主键
        alter table stu2 modify id int primary key;
        -- 实现自动增长
        alter table stu2 modify id int primary key auto_increment;
        insert into  stu2  values ( null,"python","nihao") ;
        select * from stu2;
        show create table stu2;
        -- 外键约束
        -- 创建部门表(id,dep_name,dep_location) -- 一方,主表 
        create table department(  id int primary key auto_increment,  dep_name varchar(20),  dep_location varchar(20) ); 

        -- 创建员工表(id,name,age,dep_id) -- 多方,从表 
        create table employee(  id int primary key auto_increment,  name varchar(20),  age int,  dep_id int ,
        constraint emp_dept_fk foreign key (dep_id) references department(id));

        -- 添加2个部门
         insert into department values(null, '研发部','广州'),
         (null, '销售部', '深圳'); select * from department; 

        -- 添加员工,dep_id表示员工所在的部门 
        INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1); 
        INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1); 
        INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1); 
         INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2); 
        INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2); 
        INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2); 
         select *from employee;
         drop table employee;
         drop table department;
        select * from employee;
        select  *from department;
        alter  table employee drop foreign key emp_dept_fk;
        -- 添加外键 一对多的时候 员工和部门之间就是 多对一的关系 我们在多的一地方放置一的主键 作为外键 
        -- 并且设置级联操作
        alter table employee add constraint  hhh_em  foreign key (dep_id) references department(id) on update cascade on delete cascade;

数据库设计

表之间的关系

1.  一对一的关系:人和身份证之间的关系
    吧
     处理方式 :可以再任意一方添加外键, 我个人认为 完全可以用一张表来表示 ,并且使得这个外键唯一约束 unique 

2.   一对多的关系  :例如员工和部门之间的关系 ,  一个员工对应一个部门 , 一个部门可以的对应个员我们在设计表的时候** 再多的一放建立外键 放置一的一放的主键 让他们产生关联*

    constraint 外键名 foreign key (从表的主键) references departement(主表的主键);

3. 多对多的关系: 例子:学生和课程之间 就是多对多的关系, 我们通过建立联合主键的方式, (也就是建立第三张表 里面放置对方的主键 )

数据库设计的范式

    ## 第一范式 ##
    1. 每一列都是不可分割的原子项数据(列是唯一的 不存在两个列,不是符合列
    2. 存在的问题:数据冗余重复的太多了 ,数据添加和删除 会产生不合法的数据
    ----------
    ## 第二范式 ## 
        ###     在1NF的基础上 非属性码 必须完全依赖于候选码(消除非主属性对主码的部分函数依赖)消除部分依赖  ###
    1. 函数依赖:如果A--> B 如果通过A的属性推倒出唯一的B 就说B依赖于A;学号——> 姓名

    2. 完全函数依赖: (学号, 课程名称)--> 分数  前面的就是一个属性组
        A---> B A是一个属性组则 B属性推倒确定需要依据A中属性组的所有d的属性值 

    3.部分函数依赖:属性组中的某一个属性组可以确定B属性的的值---A(学号, 课程名称)--> B分数

    4. 传递函数依赖: A——>B  B-->C 就可以说C传递函数与A;
        学号————>院系名-->  院长
    5.码:属性或者属性组 被其他属性完全依赖, 就说这个属性(属性组) 为该表的码
    ----------

    ## 第三范式 ##(**消除传递依赖**)

    ----------

数据库的还原备份

使用命令行的方式

  1. mysqldump -uroot -proot 数据库名 > 保存的路径
  2. 还原数据库: create database db 1;
  3. source a.sql

## 使用图像化界面的方式 ##
# 事务 #
1. 事务的概念:多个操作,一旦被事务管理,要不全部成功, 反之全部失败
2. 开始事务 -- 回滚 - -- 提交
3. mysql DMl语句自动提交默认自动提交 
4. 手动开启事务, 要手动提交
5. 设置手动提交 set @@autocommit = 0; 默认是1 ;
#事务的四个特征 #
1. 原子性 :不可分割的最小单位  要么同时成功要么同时失败
2. 持久性:事务提交之后或者回滚之后, 数据库会持久化的保存数据
3. 隔离性:多个事务之间相互独立;
4. 一致性:事务操作前后, 数据的总量是不变的,例如转账 钱的总数是不变的;
# 事务的隔离级别 #
概念:多个事务之间是相互独立的, 但是多个事务之间操作同一个数据; 设置不同的隔离级别 就可以解决这个些问题 ,问题如下:
    1. 脏读:一个是事务读取

到另一个事务中没有提交的事务; 2. 不可重复读:在同一个事务中 ,两次读取的数据不一样 3. 幻读:第一个事务操作 修改了数据表中的所有内容, 另外一个事务添加了数据,但是第一个事务查询不到自己的修改; ## 事务的隔离级别 ##

1. read uncommitted; 读未提交 会出现上述的三种问题
2. read committed: 读已提交 会出现不可重复读 和幻读
3. repeatable read:可以重复读
4. serializable 串行化;可以解决所有的问题

----------

5. 数据库默认的是repeatable read 可以 重复读
6. 数据库设置隔离级别:set gloabal transaction isolation level  隔离级别;

7.


DCL

-- DCL 管理用户

     -- 管理用户
     use mysql;
     select * from user; 
     -- create user 'zhangsan'@'Localhost' identified  by '123'
     create user 'zhangsan'@'%' identified by '123'; -- 创建用户 可以在任何主机上登录 用户名  zhangsan 密码:123
     -- 删除用户
     drop user 'zhangsan'@'%'; 
     -- 修改用户的密码
     select * from user;
    -- update  user set PASSWORD = password('root') where user ='123';
     set password for 'root'@'localhost' = password('root');-- 更改密码

 忘记了root 用户的密码 
 -- 1》 net stop mysql (使用管理员身份运行)
 -- 2,启动mysql服务 使用无验证 的方式 mysqld -- skip-grant-talbles 
 -- 3,在新的窗口启动mysql 输入mysql 即可 
 -- 4. set password for 'root'@'localhost' = password('root');-- 更改密码
 -- 5,使用任务管理器 关闭mysqld 服务alter
 -- 6. 使用cmd 打开mysql 服务  就可以登录了

 -- 对用户进行权限的管理a
 -- 查询权限
 show grants for 'root'@'%';
 grant all on *.* to 'root'@'%'; -- 给用户 所用的权限操作任意数据库alter
 grant delete, update ,select on db3.stu to 'liansi'@'localhost'; -- 授予权限 给那个数据库 中的表 
 -- 撤销权限
 -- revoke 权限列表 on 数据库。表名  from 用户名@主机名
 revoke select ,delete on db3.stu from 'liansi'@'localhost';
    -- revoke all ON  *.* from 'liansi'@'localhost';
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值