精华内容
下载资源
问答
  • mysql之从入门到删库跑路

    万次阅读 多人点赞 2019-10-27 13:53:41
    cd /usr/local/mysql/support-files 进入mysql命令行 /usr/local/MySQL/bin/mysql -uroot -p12345678 退出数据库 exit; 数据库相关操作 查询所有数据库 show databases; 选择(使用)数据库 use mybatis; 查询当前正在...
    启动与停止
    • 启动mysql服务
      sudo /usr/local/mysql/support-files/mysql.server start
    • 停止mysql服务
      sudo /usr/local/mysql/support-files/mysql.server stop
    • 重启mysql服务
      sudo /usr/local/mysql/support-files/mysql.server restart
    • 进入mysql目录文件
      cd /usr/local/mysql/support-files
    • 进入mysql命令行
      /usr/local/MySQL/bin/mysql -uroot -p12345678
    • 退出数据库
      exit;
    数据库相关操作
    • 查询所有数据库
      show databases;
    • 选择(使用)数据库
      use mybatis;
    • 查询当前正在使用的数据库名称
      select database();
    • 创建数据库
      create database 数据库名称;
      创建数据库,判断不存在,再创建: create database if not exists 数据库名;
    • 删除数据库
      drop database 数据库名称;
      判断数据库存在,存在再删除:drop database if exists 数据库名称;
    数据库表相关操作
    • 创建数据库表
    create table 表名(
    	列名1 数据类型1,
    	列名2 数据类型2,
    	....
    	列名n 数据类型n
    	);
    
    • 复制表
      create table 表名 like 被复制的表名;
    • 查看某个数据库中的所有的数据表
      show tables;
    • 查看数据表的结构
      desc pet;describe pet;
    • 修改表名
      alter table 表名 rename to 新的表名;
    • 修改表的字符集
      alter table 表名 character set 字符集名称;
    • 添加一列
      alter table 表名 add 列名 数据类型;
    • 删除列
      alter table 表名 drop 列名;
    • 删除表
      drop table 表名;drop table if exists 表名 ;

    • 添加数据
      insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
      其中列名和值要一一对应。如果表名后,不定义列名,则默认给所有列添加值,如:insert into 表名 values(值1,值2,...值n);除了数字类型,其他类型需要使用引号(单双都可以)引起来.
    • 删除数据
      delete from 表名 where 条件
      其中:如果不加条件,则删除表中所有记录。如果要删除所有记录, 使用delete from 表名;一般不推荐使用。这种操作有多少条记录就会执行多少次删除操作.
      TRUNCATE TABLE 表名;推荐使用,效率更高 先删除表,然后再创建一张一样的表.
    • 修改数据
      update 表名 set 列名1 = 值1, 列名2 = 值2,... where 条件;如果不加任何条件,则会将表中所有记录全部修改.
    insert into user2 values (1,'李四','123'); // 增
    delete from pet where ower = 'disn'; //删
    update pet set name = '后裔' where ower = 'dfn'; //改
    
    
    • 查询数据
    ><<=>==<>BETWEEN...ANDIN( 集合)LIKE 模糊查询	
    ⑤_单个任意字符
    ⑥%多个任意字符
    ⑦IS NULLand&&or||not!
    查询条件应用举例:
    SELECT * FROM user WHERE age >= 18;
    SELECT * FROM user WHERE age >= 18 AND  age <=36;
    SELECT * FROM user WHERE age BETWEEN 40 AND 70;
    SELECT * FROM user WHERE age IN (6,18,37);
    // 关于NULL
    SELECT * FROM user WHERE height = NULL; 错误,因为null值不能使用=或(!=) 判断
    SELECT * FROM user WHERE height IS NULL;(正确)
    SELECT * FROM user WHERE height  IS NOT NULL;(正确)
    // 查询姓陈的有哪些?< like>
    SELECT * FROM user WHERE NAME LIKE '陈%';
    // 查询姓名第二个字是新的人
    SELECT * FROM user WHERE NAME LIKE "_新%";
    // 查询姓名是三个字的人
    SELECT * FROM user WHERE NAME LIKE '___';
    // 查询姓名中包含狗的人
    SELECT * FROM user WHERE NAME LIKE '%狗%';
    
    约束相关
    • 主键约束 (primary key)
      能够唯一确定一张表中的的一条记录,我们通过给某个字段添加约束, 可以使得这个字段不重复且不为空.
     create table user (
    	id int primary key auto_increment, // 在创建表时,添加主键约束,并且完成主键自增	
    	name varchar(20)
     );
    -- 联合主键: 由多个字段联合组成的主键, 只要联合的主键加起来不重复就可以.联合主键中的任何一个字段都不能为空.
    create table user2 (
     	id int,
     	name varchar(20),
     	password varchar(20),
     	primary key(id, name)
    );
    
    

    表创建完成后:
    添加主键.如:
    alter table user add primary key(id);alter table user modify id int primary key;
    删除主键:alter table user drop primary key;

    • 唯一约束:unique 约束修饰的字段的值不可以重复.
     create table user1 (
     	id int primary key auto_increment,
      	phone_num varchar(20) unique
      	 );
     create table user2 (
     	id int primary key auto_increment,
      	name varchar(20),
      	unique(id, name) // 表示两个字段在一起不重复就可以
      	 );
      	 
    

    也可以在表创建完成后, 通过alter table user3 add unique(phone_num);alter table user3 modify phone_num varchar(20) unique;来添加unique约束.
    删除unique约束:alter table user3 drop index phone_num;

    • 非空约束:not null 修饰的字段不能为空NULL
    create table user3 (
    	id int primary key auto_increment,
    	name varchar(20) not null
    	);
    

    删除非空约束:alter table user3 modify name varchar(20);

    • 默认约束
      当我们插入字段值时候,如果对应的字段没有插入值,则会使用默认值.如果传入了值,则不会使用默认值.
    create table user4(
    	id int primary key auto_increment,
    	age int default 18,
    	name varchar(20) not null
    	);
    
    • 外键约束:foreign key
    create table 表名(
    ....
    外键列
    constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
    );
    // 班级
    create table classes(
    	id int primary key,
    	name varchar(20)
    	);	
    // 学生表
    create table student (
    		id	int primary key,
    		name varchar(20),
    		class_id int,
    		foreign key(class_id) references classes(id)
    		);
    		
    
    数据库查询进阶
    • 查询所有记录
      例如:查询student表中的所有记录.
      select * from student;
    • 查询指定字段
      例如:查询student中的sname,ssex,class.
      select sname,ssex,class from student;
    • 查询教师表中所有的单位即不重复的depart列. <排除重复distinct>
      select distinct depart from teacher;
    • 查询score表中成绩在60到80之间的所有记录 <查询区间 between…and…>
      select * from score where degree between 60 and 80;
      select * from score where degree > 60 and degree < 80;
    • 查询score表中成绩为85,86或88的记录
      select * from score where degree in(85, 86, 88);
    • 查询student表中’95031’班或性别为’女’的同学记录. <or 表示或者>
      select *from student where class = '95031' or sex = '女';
    • 以class降序查询student表的所有记录 <降序:desc, 升序asc,默认升序(省略)>.
      select * from student order by class desc;
    • 以cno升序,degree降序查询score表的所有记录
      select * from score order by cno asc,degree desc;
    • 查询"95031’班的学生人数 <统计 count>
      select count(*) from student where class = '95031';
    • 查询score表中最高分的学生学号和课程号(子查询)
      select sno, cno from score where degree = (select max(degree) from score );其中:select max(degree) from score 先查出最高分.
      select sno,cno degree from score order by degree desc limit 0,1;其中:limit第一个数字表示从多少开始,第二个表示多少条.当有多个相同最高分时,容易出bug,不推荐使用这种方式查询.
    • 查询每门课的平均成绩
      select cno, avg(degree) from score group by cno;
    • 查询score表中至少有2名学生选修的并以3开头的课程的平均分数.
      select cno, avg(degree) from score group by cno having count(cno) >= 2 and cno like '3%';
    • 查询分数大于70, 小于90的sno列.
      select sno, degree from score where degree between 70 and 90;
    • 查询所有学生的sname, cno和degree列.
      select sname, cno, degree from student, score where student.sno = score.sno;
    • 查询所有学生的sno,cname和degree列
      select sno,cname,degree from course ,score where course.cno = score.cno;
    • 查询"95031"班学生每门课的平均分.
      select cno, avg(degree) from score where sno in (select sno from student where class = '95031') group by cno;
    • 查询选修"3-105"课程的成绩高于"109"号同学"3-105"成绩的所有同学的记录.
      select * from score where cno = '3-105' and degree > (select degree from score where sno = '109' and cno = '3-105');
    • 查询成绩高于学号为"109", 课程号为"3-105"的成绩的所有记录
      select * from score where degree > (select degree from score where sno = '109' and cno = '3-105');
    • 查询和学号为108,101的同学同年出生的所有的sno, sname, sbirthday
      select *from student where year(sbirthday) in (select year(sbirthday) from student where sno in(108, 101));
    • 查询"张旭"教师任课的学生成绩
      select * from score where cno = ( select cno from course where tno = (select tno from teacher where tname = "张旭"));
    • 查询选修某课程的同学人数多于5人的教师姓名.
      select tname from teacher where tno = (select tno from course where cno = (select cno from score group by cno having count(*) > 5));
    • 查询存在有85分以上的成绩的课程的cno
      select cno, degree from score where degree > 85;
    • 查询出"计算机系"教师所教课程的成绩表
      select * from score where cno in (select cno from course where tno in (select tno from teacher where depart = "计算机系"));
    • 查询选修编号为"3-105"课程且成绩至少高于选休息编号为"3-245"的同学的cno,sno和degree,并按degree从高到低次序排序.
      any 至少一个.
    select * from score where cno = '3-105' and degree > any(select degree from score where cno = '3-245') order by degree desc;
    
    
    • 查询选修编号为"3-105"课程且成绩高于选休息编号为"3-245"的同学的cno,sno和degree,并按degree从高到低次序排序.
      all 表示所有
    select * from score where cno = '3-105' and degree > all(select degree from score where cno = '3-245') order by degree desc;
    
    
    • 查询所有教师和同学的name, sex和birthday
    select tname as name, tsex as sex, tbirthday as birthday from teacher union select sname, ssex, sbirthday from student;
    
    
    • 查询所有"女"教师和"女"同学的name,sex和birthday
    select tname as name, tsex as sex, tbirthday as birthday from teacher where tsex = '女' union select sname, ssex, sbirthday from student where ssex = '女';
    
    
    
    • 查询成绩比该课程成绩低的同学的成绩表
      思路: 从a表查出对应的分数跟b表筛选出来的平均分作比较.
    select * from score a where degree < (select avg(degree) from score b where a.cno = b.cno);
    表a
    +-----+-------+--------+
    | sno | cno   | degree |
    +-----+-------+--------+
    | 101 | 3-105 |     91 |
    | 102 | 3-105 |     92 |
    | 103 | 3-105 |     92 |
    | 103 | 3-245 |     86 |
    | 103 | 6-166 |     85 |
    | 104 | 3-105 |     81 |
    | 105 | 3-105 |     88 |
    | 105 | 3-245 |     75 |
    | 105 | 6-166 |     79 |
    | 109 | 3-105 |     76 |
    | 109 | 3-245 |     68 |
    | 109 | 6-166 |     81 |
    +-----+-------+--------+
    12 rows in set (0.00 sec)   
    
    表b
    | sno | cno   | degree |
    +-----+-------+--------+
    | 101 | 3-105 |     91 |
    | 102 | 3-105 |     92 |
    | 103 | 3-105 |     92 |
    | 103 | 3-245 |     86 |
    | 103 | 6-166 |     85 |
    | 104 | 3-105 |     81 |
    | 105 | 3-105 |     88 |
    | 105 | 3-245 |     75 |
    | 105 | 6-166 |     79 |
    | 109 | 3-105 |     76 |
    | 109 | 3-245 |     68 |
    | 109 | 6-166 |     81 |
    +-----+-------+--------+
    12 rows in set (0.00 sec) 
    
    
    • 查询所有任课教师的tname和depart
      select tname, depart from teacher where tno in (select tno from course);
    • 查询至少有两名男生的班号
    select class from student where ssex= '男' group by class having count(*) > 1
    
    
    • 查询student表中不姓"王"的同学记录
    select * from student where sname not like '王%';
    
    • 查询student表中每个学生的姓名和年龄
    select sname, year(now()) - year(sbirthday)  as '年龄' from student;
    
    • 查询student表中最大和最小的sbirthday日期值
    select max(sbirthday) as '最大', min(sbirthday) as '最小' from student;
    
    • 以班号和年龄从大到小的顺序查询student表中的全部记录
    select * from student order by class desc, sbirthday;
    
    • 查询"男"教师及其所上的课程
    select * from course where tno in (select tno from teacher where tsex = '男');
    
    
    • 查询最高分同学的sno, cno和degree列
    select * from score where degree = (select max(degree) from score);
    
    • 查询和李军同性别的所有同学的sname
    select sname from student where ssex = (select ssex from student where sname = '李军');
    
    
    • 查询和李军同性别并同班 同学sname
    select sname from student where ssex = (select ssex from student where sname = "李军") and class = (select class from student where sname = '李军');
    
    
    • 查询所有选修"计算机导论"课程的"男"的成绩表
    select * from score where cno = (select cno from course where cname = '计算机导论') and sno in(select sno from student where ssex = '男');
    
    
    SQL的四种连接查询
    分析用例的数据准备:
    mysql> select * from person;
    +----+--------+--------+
    | id | name   | cardId |
    +----+--------+--------+
    |  1 | 张三   |      1 |
    |  2 | 李四   |      3 |
    |  3 | 王五   |      6 |
    +----+--------+--------+
    3 rows in set (0.00 sec)
    mysql> select * from card;
    +------+-----------+
    | id   | name      |
    +------+-----------+
    |    1 | 饭卡      |
    |    2 | 建行卡    |
    |    3 | 农行卡    |
    |    4 | 工商卡    |
    |    5 | 邮政卡    |
    +------+-----------+
    5 rows in set (0.00 sec)
    
    • 内连接
      inner join 或者 join, 后面通常跟对一个on表示条件
      ---- 内联查询: 就是两张表中的数据, 通过某个字段相等,查询出相关记录数据.
      <当前表中的cardid与id相同.>
    select * from person inner join card on person.cardId = card.id;
    +----+--------+--------+------+-----------+
    | id | name   | cardId | id   | name      |
    +----+--------+--------+------+-----------+
    |  1 | 张三   |      1 |    1 | 饭卡      |
    |  2 | 李四   |      3 |    3 | 农行卡    |
    +----+--------+--------+------+-----------+
    2 rows in set (0.00 sec)
    
    
    • 外连接
      左外连接:左连接 left join 或者 left outer join
      ---- 左外连接, 会把左边表里面的所有数据取出来, 而右边表中的数据,如果有相等的,就显示出来, 如果没有, 则会补NULL.
    select * from person left join card on person.cardId = card.id;
    
    +----+--------+--------+------+-----------+
    | id | name   | cardId | id   | name      |
    +----+--------+--------+------+-----------+
    |  1 | 张三   |      1 |    1 | 饭卡      |
    |  2 | 李四   |      3 |    3 | 农行卡    |
    |  3 | 王五   |      6 | NULL | NULL      |
    +----+--------+--------+------+-----------+
    3 rows in set (0.00 sec)
    
    

    右外连接:右连接 right join 或者right outer join
    ----右外连接, 会把右边表里面的所有数据取出来, 而左边表中的数据,如果有相等的,就显示出来, 如果没有, 则会补NULL.

    select * from person right join card on person.cardId = card.id;
    
    +------+--------+--------+------+-----------+
    | id   | name   | cardId | id   | name      |
    +------+--------+--------+------+-----------+
    |    1 | 张三   |      1 |    1 | 饭卡      |
    |    2 | 李四   |      3 |    3 | 农行卡    |
    | NULL | NULL   |   NULL |    2 | 建行卡    |
    | NULL | NULL   |   NULL |    4 | 工商卡    |
    | NULL | NULL   |   NULL |    5 | 邮政卡    |
    +------+--------+--------+------+-----------+
    5 rows in set (0.01 sec)
    
    

    全外连接:完全外连接 full join 或者full outer join<mysql不支持full join>

    mysql> select * from person full join card on person.cardId= card.id;
    ERROR 1054 (42S22): Unknown column 'person.cardId' in 'on clause'
    **** 解决mysql不支持full join的方法****
     <左连接 + 右链接> , 即通过union来连接左右连接. <左连接 union 右链接>.
    eg:
    
    select * from person left join card on person.cardId = card.id union select * from person right join card on person.cardId = card.id;
    
    +------+--------+--------+------+-----------+
    | id   | name   | cardId | id   | name      |
    +------+--------+--------+------+-----------+
    |    1 | 张三   |      1 |    1 | 饭卡      |
    |    2 | 李四   |      3 |    3 | 农行卡    |
    |    3 | 王五   |      6 | NULL | NULL      |
    | NULL | NULL   |   NULL |    2 | 建行卡    |
    | NULL | NULL   |   NULL |    4 | 工商卡    |
    | NULL | NULL   |   NULL |    5 | 邮政卡    |
    +------+--------+--------+------+-----------+
    6 rows in set (0.01 sec)
    
    
    要点梳理
    • where 和 having 的区别?
      (1) having通常用在聚合函数前面,对聚合函数进行过滤,(MAX、MIN、COUNT、SUM).having通常和group by 一起连用,因为where不能加在group by的后面.
      (2) where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来. where 后不可以跟聚合函数,having可以进行聚合函数的判断。
    MYSQL执行语句顺序,严格遵循次顺序,不能改变
    select
    from
    where
    group by
    having
    order by
    
    mysql的事务
    • 关于事务
      mysql中, 事务其实是一个最小的不可分割的工作单元. 事务能够保证一个业务的完整性.
      分析:
    例如:
    a --> -100
    update user set money = money - 100 where name = 'a';
    b --> +100
    update user set money = money + 100 where name = 'b';
    -- 实际程序中, 如果只有一条sql语句执行成功了,而另外一条没有执行成功?则会出现前后数据不一致的情况.
    update user set money = money - 100 where name = 'a';
    update user set money = money + 100 where name = 'b';
    在多条sql语句,可能会有同时成功的要求,要么就同时失败.
    
    
    • 事务控制
      (1)事务主要包含自动提交@@autocommit=1;,手动提交commit;和事务回滚rollback;.
      (2) mysql默认是开启事务的(自动提交).
      ----当我们去执行一个sql语句的时候,效果会立即提现出来,且不能回滚.
      set autocommit = 0;设置mysql是否自动提交,<0为否, 1为是.>
      select @@autocommit;查看mysql的自动提交方式.
      commit; 手动提交.
      具体事务控制相关参照下面代码分析:
    mysql> select @@autocommit;
    +--------------+
    | @@autocommit |
    +--------------+
    |            1 |
    +--------------+
    1 row in set (0.00 sec)
    // 建表
    create database bank;
    create table user (
    	id int primary key,
        name varchar(20),
        money int
        );
    // 首先在表中插入一条用户数据a.
    insert into user values (1,'a',1000);
    Query OK, 1 row affected (0.00 sec)
    // 进行回滚操作.
    mysql> rollback;
    Query OK, 0 rows affected (0.00 sec)
    // 执行回滚后,查看数据表信息,发现即使调用了rollback,但插入的数据依然存在.说明当前不能回滚.
    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    |  1 | a    |  1000 |
    +----+------+-------+
    1 row in set (0.00 sec)
    // 可以通过设置msql的回滚自动提交为false.
    set autocommit = 0;
    Query OK, 0 rows affected (0.00 sec)
    mysql> select @@autocommit;
    +--------------+
    | @@autocommit |
    +--------------+
    |            0 |
    +--------------+
    1 row in set (0.00 sec)
    // 也就说, 通过上面的set autocommit = 0;操作关闭了mysql的自动提交(commit).
    *******再次插入数据:*******
    insert into user values (2,'b',1000);
    Query OK, 1 row affected (0.00 sec)
    // 插入数据后查看表,用户2数据添加成功.
    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    |  1 | a    |  1000 |
    |  2 | b    |  1000 |
    +----+------+-------+
    2 rows in set (0.00 sec)
    // 执行回滚操作.
    mysql> rollback;
    Query OK, 0 rows affected (0.00 sec)
    // 回滚后再次查看表,发现刚才插入的数据已经被干掉了.
    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    |  1 | a    |  1000 |
    +----+------+-------+
    1 row in set (0.01 sec)
    **** 对于这种场景,如果想让用户b数据成功提交, 可以通过commit;命令执行手动提交操作.手动提交后,如果想再次通过rollback来撤销,则是不可以的.也就是说,事务一旦提交,执行的sql语句就不可以再撤销,也就是说事务一旦提交数据就会持久的产生效果.
    
    
    
    

    (3)手动开启事务
    beginstart transaction都可以手动开启一个事务. 也就是说,当我们当前的mysql如果默认的是自动提交模式,则执行rollback进行事务回滚则是无效的. 但是可以通过beginstart transaction手动开启事务.

    即:
      当前默认为自动提交模式,此时执行rollback无效.执行下面sql语句:
      start transaction;(或者begin;)
      update user set money = money - 100 where name = 'a';
      update user set money = money + 100 where name = 'b';
      执行完插入a,b用户数据后,再执行rollback,发现可以成功回滚事务.可以成功切换成手动开启事务的模式.若想使得插入的数据生效,也需要手动执行commit进行提交操作.
      事务开启之后,一旦commit提交,就不可以回滚,也就说,当前的这个事务在提交的时候就已经结束了.
      
    
    • 事务的四大特征
      A 原子性: 事务是最小的单元, 不可以在分割.
      C 一致性: 事务要求, 同一事务中的sql语句必须保证同时成功,同时失败.
      I 隔离性: 事务1 和事务2之间shi具有隔离性的.
      D 持久性: 事务一旦结束(commit,rollback),就不可以返回.
    • 事务的隔离性
      多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题.
      存在问题:
      (1) 脏读:一个事务,读取到另一个事务中没有提交的数据.
      (2)不可重复读(虚读):在同一个事务中,两次读取到的数据不一样.
      (3)幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改.
      read uncommitted; 读未提交的–>产生的问题:脏读、不可重复读、幻读.
      read committed; 读已经提交的–>产生的问题:不可重复读、幻读repeatable read; 可以重复读–>产生的问题:幻读
      serializable; 串行化<性能特差>
      通常是隔离级别越高,性能越差.
      (1)查看数据库的隔离级别
      mysql默认的隔离级别: REPEATABLE-READ
      mysql8.0:
      系统级别的:select @@global.transaction_isolation;
      会话级别的:select @@transaction_isolation;
      mysql5.x:
      系统级别的:select @@global.tx_isolation;
      会话级别的:select @@tx_isolation;
    mysql> select @@global.transaction_isolation;
    +--------------------------------+
    | @@global.transaction_isolation |
    +--------------------------------+
    | REPEATABLE-READ                |
    +--------------------------------+
    1 row in set (0.00 sec)
    

    (2)修改隔离级别
    set global tansaction isolation level read uncomitted;

    数据库的三大范式
    • 第一范式
    • 数据表中的所有字段都是不可分割的原子项.初步可以理解为:字段值还可以继续拆分的,就不满足第一范式.
      比如某表中有一个address的字段,插入值为"中国陕西省西安市碑林区柏树林11号".该字段值是可以继续拆分的,原则上就不满足第一范式.可以依次拆分为:国家/省/市/区/街道等等.
      当然,范式设计的越详细,对某些实际操作可能会更好.但不一定都是好处.<比如对address字段来说,可能拆分开来永远都用不到这么详细的信息,可能就没有拆分的必要.>
    • 第二范式
      必须是满足第一范式的前提下,第二范式要求,除主键外的每一列都必须完全依赖主键.如果要出现不完全依赖,只可能发生在联合主键的情况下.
    例如:
    create table myorder(
    		product_id int,
    		customer_id int,
    		product_name varchar(20),
    		customer_name varchar(20),
    		primary key(product_id, customer_id
    	);
    	当前表中, 除主键以外的其他列, 只依赖于主键的部分字段.则不满足第二范式,通常需要拆表.
    create table myorder(
    		order_id int primary key,
    		product_id int,
    		customer_id int
    	);
    create  table product (
    		id int primary key,
    		name varchar(20)
    	);
    create table customer(
    		id int primary key,
    		name varchar(20)
    		);
    拆分成三个表后,满足第二范式.
    
    • 第三范式
      必须先满足第二范式.除开主键列的其他列之间不能有传递依赖关系.
    附件

    查询语句所涉及的sql语句

    create table student(
    	sno varchar(20) primary key,
    	sname varchar(20) not null,
    	ssex varchar(20) not null,
    	sbrithday datetime,
    	class varchar(20)
    	);
    
    create table student(
    	sno varchar(20) primary key,
    	sname varchar(20) not null,
    	ssex varchar(10) not null,
    	sbirthday datetime,
    	class varchar(20)
    )
    
    create table teacher(
    	tno varchar(20) primary key,
    	tname varchar(20) not null,
    	tsex varchar(20) not null,
    	tbirthday datetime,
    	prof varchar(20) not null,
    	depart varchar(20) not null
    	);
    
    create table course(
    	cno varchar(20) primary key,
    	cname varchar(20) not null,
    	tno varchar(20) not null,
    	foreign key(tno) references teacher(tno)
    	);
    
    create table score(
    	sno varchar(20) not null,
    	degree decimal,
    	primary key (sno, cno),
    	foreign key (sno) references student(sno),
    	foreign key (cno) references course(cno)
    	);
    
    insert into student values ('101','曾华','男','1977-09-01','95033');
    insert into student values ('102','匡明','男','1975-10-02','95031');
    insert into student values ('103','王丽','女','1976-01-23','95033');
    insert into student values ('104','李军','男','1976-02-20','95033');
    insert into student values ('105','王芳','女','1975-02-10','95031');
    insert into student values ('106','陆君','男','1974-06-03','95031');
    insert into student values ('107','王尼玛','男','1976-02-20','95033');
    insert into student values ('108','张全蛋','男','1975-02-10','95031');
    insert into student values ('109','赵铁柱','男','1974-06-03','95031');
    
    insert into teacher values ('804','李成','男','1958-12-02','副教授','计算机系');
    insert into teacher values ('856','张旭','男','1969-03-12','讲师','电子工程系');
    insert into teacher values ('825','王萍','女','1972-05-05','助教','计算机系');
    insert into teacher values ('831','刘冰','女','1977-08-14','助教','电子工程系');
    
    insert into course values ('3-105','计算机导论', '825');
    insert into course values ('3-245','操作系统', '804');
    insert into course values ('6-166','数字电路', '856');
    insert into course values ('9-888','高等数学', '831');
      
    insert into score values('103','3-245','86');
    insert into score values('105','3-245','75');
    insert into score values('109','3-245','68');
    insert into score values('103','3-105','92');
    insert into score values('105','3-105','88');
    insert into score values('109','3-105','76');
    insert into score values('103','3-105','64');
    insert into score values('105','6-166','79');
    insert into score values('109','6-166','81');
    
    
    create table person(
    	id int primary key auto_increment,
    	name varchar(20),
    	cardId int
    );
    
    create table card (
    	id int,
    	name varchar(20)
    );
    
    insert into card values (1,'饭卡');
    insert into card values (2,'建行卡');
    insert into card values (3,'农行卡');
    insert into card values (4,'工商卡');
    insert into card values (5,'邮政卡');
    
    insert into person values (1,'张三',1);
    insert into person values (2,'李四',3);
    insert into person values (3,'王五',6);
    
    
    
    
    展开全文
  • 知乎话题:不小心删库是一种怎样的体验 一、引言 读完了知乎上对于“删库”这个话题下面的讨论,我感受颇深,“删库”这两个字虽然最近已经成为了计算机专业的学生或工作人员开玩笑的常用词汇,但与此同时,这其实...

    知乎话题:不小心删库是一种怎样的体验

    一、引言

    读完了知乎上对于“删库”这个话题下面的讨论,我感受颇深,“删库”这两个字虽然最近已经成为了计算机专业的学生或工作人员开玩笑的常用词汇,但与此同时,这其实也是一个严肃的安全问题。

    删库这个操作没有太大的难度,但造成的损失确实巨大的,尤其是对于一些大型公司,他们的数据有很高的含金量,删库这种操作会对他们造成巨大的损失:

    某机场请了一个大牛DBA去帮忙调数据库的时候出了意外,结果几个小时内整个机场无法正常运行,损失几百万

    所有用户都不能缴费。这可是一千三四百万金额的钱啊,银行已经扣钱了

    ...

    出现这种事情不仅仅是因为某个人不小心的结果,后面隐藏着整个团队或公司的安全意识淡薄,看了这么多的讨论,我发现意外发生的原因主要集中在”管理”、“备份”、“习惯”这几点上。

    二、问题分析

    1.管理:

    首先来说一下管理的问题,管理在技术上主要体现在权限,常见的问题就是给一些技术不够熟练或者不靠谱的人较高的权限,知乎下面很多人都是由于不小心改动了正式库,才造成了巨大的损失,如果他们只能修改测试库的话就不会造成这么大的问题。体现的更明显的则是在Linux下,很多人都是有了root权限之后执行了”rm -rf /”这条命令,然后才使得悲剧发生,而在讨论中查找“实习”这个关键词之后,却能看到很多的结果,可见正是由于这种权限的管理不严密,才造成了这些意外的发生。

    除此之外团队内部的协调问题也会造成严重的安全问题,比如:“初步检查发现是我周末的清理临时文件的计划任务脚本,因为逻辑是“进入XX目录,然后删除所有文件”结果XX目录当时不存在(被另一个同事重命名了)从而在根目录开删”,这段话,这就是一个协调不够好的结果,造成这个结果的可能原因就是命名不够醒目,比较随意,导致同事人为这是一个无关紧要的文件然后重命名或者删除。协调还体现在文档上,很多突发情况发生时,很少看到有人去查看相关的文档,这有两种可能,一种是开发人员没有书写相关的文档,另一种是使用人员没有看文档的意识,不管是哪一种,他们都忽略了文档的重要性。

    最后就是团队应该对可能出现的问题做好预案,并且提前给员工打好预防针,真的不小心操作失误一定要及时的报告上级,而不是隐藏:一方面,由于有日志,隐藏不太可能,另一方面,知道操作原因也有助于团队及时进行补救,相比及时进行补救,隐藏等待问题爆发造成的损失更大。

    2.备份:

    在话题下面的案例中,大多数人的救命稻草都是”备份”,无论大型还是小型公司往往都会有备份,就是备份时间长短的问题,或是几月,或是几天。但是意外发生时,几月前的备份和几天甚至一天前的备份的修复体验可就完全不同了,没备份就只能靠手工,而这效率则极低,所以犯错的人要付多大的代价完全取决于备份的人有多懒了。

    个人的经历则往往更惨,很多案例都是不小心格式化了自己的电脑、自己的U盘,然后失去了十几年的青春回忆,甚至里面雷军的例子--被修过电脑时候不再写代码。如果他们曾经备份过,就可以极大的减小自己的损失了。

    3.习惯:

    个人习惯也往往会造成很大的影响,这里根据文档中的案例列举一些常见的不良习惯:

    • 格式化之前不确认有没有重要资料。
    • 对生产库与测试库或者生产环境与测试环境没有明显的区分。
    • update、delete不加条件或没有审核条件。
    • Shift+delete删除文件。
    • 没有及时git。
    • 执行不熟悉的命令。
    • rm -rf前没有任何的确认

    三、问题重现与解决方法

    这一节根据上一节分析出的一些问题进行重现,并提出解决方案,在可能的情况下对解决方案进行演示:

    1.管理:

    就从权限问题上来进行重现,展示数据库和Linux系统下给一些技术不够熟练的人一些不恰当权限可能带来的危害。

    1.1.数据库操作:

    图1.对一些重要的表给予一名新手过高的权限可能发生的事情
    图1.对一些重要的表给予一名新手过高的权限可能发生的事情

     

    图2.严格把控权限后执行危险语句的结果
    图2.严格把控权限后执行危险语句的结果

     

    数据库本身已经有权限的机制了,作为DBA应该灵活的运用GRANT与REVOKE语句,给予每个人恰当的权限,而不是一股脑的给每个人所有权限。这也说明一个公司拥有一个负责的DBA的重要性,这样做也可以在根源上断绝新人犯错误的可能性,从图1和图2的对比也可以明显的看出这样做的好处。

    1.2.Linux控制台操作: 

    图3.某人执行了rm -rf语句造成的后果
    图3.某人执行了rm -rf语句造成的后果

    Linux控制台下执行rm -rf这条语句往往会造成严重的后果,如图3,很多重要的文件一秒消失。作为系统管理员,就有职责预防这条语句执行时可能造成的后果。 

     

    图4.管理员严格限制了权限后执行rm -rf的情况

     首先对于一些用于读的文件,管理员可以在读写权限上进行控制,如图4,利用chmod命令将文件或文件夹对他人的权限置为只读,这样可以有效的防止他人删除自己的文件,除非他拥有root权限。

    图4.管理员严格限制了权限后执行rm -rf的情况
    图5.使用chattr命令防止文件被删除

    管理员也可以使用chattr这个更强大的命令来对文件进行保护,它可以改变文件属性,让删除变得更难。如图5,在使用了chattr命令后,他人首先无法对文件进行删除了,非但如此,自己如果误删文件,也无法成功,甚至使用sudo命令也是如此,这也足以见得该命令对于文件的保护之强大。当然这种保护也不是永久的,随时可以把文件属性再修改为可修改,但这需要sudo权限,如果有人专门取消了文件不可删除属性然后再进行了删除,也基本上可以确定删除操作是故意执行的了。

     1.3.管理层面的措施:

     由于没有相关的经历,这里我摘取了讨论中一些感觉比较有效的例子作为参考,虽然这可能导致工作效率较低,但是应该足够安全:

    看了这个回答就发现我们公司这么变态的安全管理还是很有必要的。
    要删库?对不起,所有碰production database的代码都得先review,再提交,再release才可以。想要误操作一下,至少得过peer reviewer和release engineer两关才操作得了。
    即使这样,我好像还是不小心删过一回。不算删吧,写错地方,把其他数据覆盖了。幸好每个小时都有备份,马上恢复,大概损失了5分钟的数据。
    故意删文档的遇到过一个。X被从A项目调到B项目去,心怀不满,当即就把A项目的所有文档全删了。接手的发现了,马上汇报上级。第二天,凡经过X手上使用过公司电脑删除过的所有文件都回来了转到了X老板手里面,工作N年累计的几十万个文件,包括很多X很多私人文件,什么自己记的帐,还有保险单之类的,全部都恢复出来了。之后X就被开除了。后来我才知道,公司所有电脑,每15分钟到一个小时都会自动备份。
    所以我也绝对不敢在公司电脑上干私事。--知乎匿名用户

    搞了这么多年数据库还没有犯过这种错误,不是个人水平厉害,而是运营制度严格。太TM严了,我不觉得一般公司有必要搞的大家跟神经病似的,不过还是分享一下吧。还有要是公司没钱,就不用浪费时间继续往下看了
    1,首先任何人犯错都不是个人问题,而是制度的问题。不论技术多高,学历多牛,经验多丰富,只要是人,都有可能犯错,区别是犯错的概率有大有小。要防止(完全防止理论上是不可能的)或减少个人犯错的几率,首先从规章制度下手,比如:
    分割环境。在线数据库除了支持在线业务,不承担任何其他功能。开发,测试,预演都要有自己的拷贝,各个环境之间物理分割。
    权限控制。运营数据库只允许运营部门访问,所以只有可能运营的人不小心在非在线环境犯错,开发和测试人员不会在运营环境犯错。
    系统变动。在线数据库不能随便改,哪怕是很小的改动,公认的人畜无害,也不能不经批准擅自改动。这主要是保证在线系统的稳定性,还有就在遇到复杂的bug,可以迅速回到以前的状态。
    自动化。这个很重要,没时间展开聊,基本想法是机器出差的概率比人低。
    2,系统变更要有严格的管理和详细的记录。这个不是给事后诸葛亮预备的,在改动之前相关人员和部门要清楚更改内容,无论是数据库升级,还是改个密码,大家要清楚为什么改,改什么,改了以后有什么影响,改出问题怎么办。
    下面内容太多,懒了。。。
    计划
    测试
    批准
    更改
    紧急情况
    3,在线系统的问题是所以人的问题。负责运营的兄弟们是不是听过类似“这个代码在QA跑的好好的,在你们这儿出的问题和我无关”?这种思想从上到下一定要杜绝,我的问题就是公司的问题,公司的问题就是你的问题。我见过为了赶进度测试不完整,代码不优化,全等到了production再说的部门,操作这种产品出差率很高,甚至有时不得不在线修改。
    4,在线系统稳定性由高层决定。
    前边说的说到底就是钱的问题,不过有钱有有钱的活法,没钱有没钱的活法,全看大boss是不是舍得给运营部门投钱。想要五个9的数据库,全套测试环境要花钱,全套预演环境要花钱,自动化软件,管理软件也要花钱,什么?没钱?那对不起删库有可能无法避免。” --知乎用户’向往退休

     2.备份:

     2.1.数据库备份方式:

    由于数据库往往部署于Linux服务器上,因此我们可以利用Linux的脚本来实现自动化部署。

    首先实现一个备份用的脚本:

    #!/bin/bash
    #文件名: backSql.sh
    #用途:备份数据库
    USERNAME='test' #数据库用户名
    PASSWORD='test' #数据库密码
    DATABASE='ztest'    #数据库名称
    curDate=`date "+%Y-%m-%d_%H:%M:%S"` #文件名根据当前时间生成
    mysqldump -u$USERNAME -p$PASSWORD "$DATABASE">~/桌面/信息安全/test/$curDate.sql

    然后在crontab里面添加一个新的任务:

    图6.添加备份任务到计划任务表中
    图6.添加备份任务到计划任务表中

    这里为了演示,设置两分钟备份一次,实际上一小时备份一次就已经足够了。

    图7.运行情况
    图7.运行情况

    2.2.Linux部分文件备份方式

    对于Linux下的一些重要的源代码或者图片之类的文件也可以经常进行备份,或者写到crontab中进行定时备份,我们可以利用简单的zip之类的压缩命令压缩目标文件夹,然后配合ssh命令上传到某其它服务器中实现备份的目的,也可以利用rsync命令更方便的实现快照功能。

    之前学Shell脚本的时候用zip和except命令实现过一些脚本来对一个文件夹进行过备份:

    图8.back.sh备份的主要逻辑
    图8.back.sh备份的主要逻辑
    图9.upload.sh 上传压缩过的文件
    图9.upload.sh 上传压缩过的文件
    图10.deleteHistory.sh 删除历史文件
    图10.deleteHistory.sh 删除历史文件

     基本思路就是在本地对文件夹进行压缩,然后上传到云服务器,并且清除掉历史文件,不过事实上,Linux下也有更好用的自带的备份方式,就是rsync命令:

    图11.执行rsync备份快照到远程服务器与还原文件到本地

     如图11所示,使用rsync命令可以一键将文件备份到远程服务器,在需要的时候可以再将其很轻松的恢复到本地,而不需要编写额外的脚本。这个命令也可以配合crontab使用,使得备份更加自动化。

    2.3.关于备份的其它要注意的点:

    执行自动化备份之后应该经常抽查备份文件,查看备份是否与预期的相同,有时候有可能由于某种原因导致备份文件出错,而这相当于毁掉了自己的救命稻草,因此应该经常检查确保万无一失。

    此外有时候没有很好的备份时我们可以查看运行日志,比如MySQL数据库就可以查看binlog,这样即使通过手工输入也能挽回部分损失,知乎下的讨论中很多没有做备份的人也是用log保住了一部分数据。

     3.个人习惯:

    个人不良习惯也是导致危险操作的原因之一,这里我从讨论中找出了一些很好的做法或者是自己想出的一些应对方式。

    3.1.生产库与测试库 生产环境和测试环境分不清:

    生产环境和测试环境的控制台最好使用不同的用户名登录,同时主机名也尽量避免重复,这样可以帮助我们分清测试环境和生产环境。

    此外知乎下有人提供的在mysql下分清两种环境的建议也非常不错:

    启动mysql时设定一个特定的prompt。使用--prompt=来给生产环境设置一个特别的提示符。
    $ mysql -uroot -p --prompt='PRODUCTION> '

    PRODUCTION> SELECT 1 + 2;

    3.2.在根目录下rm -rf或者是在root权限下cd ..进入根目录: 

    关于这点我觉得最好的方法是尽量不要用root角色来做事,需要高权限的时候再sudo比较好,此外rm -rf之类的危险操作之前最好先使用pwd来查看一下当前目录,确保自己不会做出什么不好的事情来。

    3.3.直接运行不知道的命令:

    这是一个很危险的做法,在多人工作的情况下,谁用了某个命令就要对自己的行为负责,所以最好不要去贸然执行不知道的命令,否则就要背这个锅。在自己工作的时候即使要执行不知道的命令,也最好百度一下用法,防止造成不必要的损失。

    3.4.update、delete不加条件或条件加错:

    我在执行update和delete之前,会先用select语句加上where执行一下看看会有多少结果收到影响,然后再使用delete或者update语句正式执行,这样做会让自己在修改数据之前再次确认,防止自己出错。

    图12.MySQL Workbench执行危险语句时的效果
    图12.MySQL Workbench执行危险语句时的效果

    此外,在MySQL Workbench中尝试执行不加where的语句时,它会报错,如图12,而直接在命令行中执行却不会,这也说明了一些数据库可视化工具已经考虑到这种粗心的问题了,所以我们也可以利用这些工具来辅助我们对数据库进行操作。

    3.5.删除非常彻底,不留后路:

    知乎话题下的讨论中,我看到了很多不错的做法,比如:

    • 删除时不要用shift
    • 不要着急清理回收站,除非确认这些东西不会再用到
    • 尽量用mv命令而不是rm命令来删除

    总之原则就是“给自己留条后路”,所以我现在在删除某个文件时也往往使用mv *** ***.old来代替rm ***,希望有一天也会感谢自己的这种做法吧。

    3.6.不会善用git:

    很多团队或者都会使用git来进行代码的维护,但如果写了代码不commit、push,一旦发生了什么意外,可能很多天的工作量都变成了徒劳。因此经常commit并且写好详细的注释才是最好的做法,一方面,这样可以让别人看见自己的努力,另一方面,这也是对自己的一份保险,即使本地的代码库没了也可以再pull一份下来而不是从头再来。

    四、总结:

    总之,“删库”这个问题发生的原因主要在于人们的安全意识不够,我们可以用管理+技术来对这种情况加以预防,同时也要培养自己良好的习惯,防止不好的习惯给自己带来不良的影响,最后希望“从删库到跑路”这句话只存在与玩笑之中吧。

    展开全文
  • MySQL - 最经典的 命令行操作数据库 + 表(增改查实例) 安装 MySQL 请参考:MySQL 安装 + 入门大全 + 常用命令合集 增改查实例步骤: (1)登录 MySQL,创建新的数据库,切换数据库: (2)创建相对复杂的表,...

    MySQL - 最经典的 命令行操作数据库 + 表(增删改查实例)

    安装 MySQL 请参考:MySQL 安装 + 入门大全 + 常用命令合集

    增删改查实例步骤:

    (1)登录 MySQL,创建新的数据库,切换数据库:

    (2)创建相对复杂的表,查看表结构:

    (3)插入一条数据:

    (4)忽略自增的插入数据:

    (5)插入多条数据:

    (6)查看表中数据:

    (7)修改表中数据:

    (8)删除表中数据:

    支持博主

    我正在参加 CSDN 2018 年博客之星评选,希望大家能支持我,
    我是【No. 001】号,感谢大家宝贵的一票 ^_^/ 投票地址:https://bss.csdn.net/m/topic/blog_star2018/index

    展开全文
  • 如果你的数据库被了,我在这先表示同情,先冷静,深呼吸,放松,准备跑路! 我是因为数据库权限没有设置好,设置成了DDL权限,同事误操作导致数据库被删除。 我的数据库的环境是,阿里云的RDS mysql5.7 高可用版,...

    前言

    • 如果你的数据库被删了,我在这先表示同情,先冷静,深呼吸,放松,准备跑路!
    • 我是因为数据库权限没有设置好,设置成了DDL权限,同事误操作导致数据库被删除。
    • 我的数据库的环境是,阿里云的RDS mysql5.7 高可用版,如果你不是阿里云的RDS可能不大合适此文章。一定要开启RDS的SQL洞察功能可以查看sql记录。

    事发

    数据库被删了,平台登不上看错误日志,发现数据库不见了???赶紧提交工单让阿里云技术人员查看问题,得到回复:

    [问题定义]
    
    描述问题:数据丢失
    
    
    [处理建议]
    请您在DMS或者mysql命令行确认下。
    
    如果数据丢失,请您考虑使用DMS数据追踪或者克隆实例方法恢复数据
    1.请您使用DMS数据追踪功能恢复数据,请您详见:https://help.aliyun.com/document_detail/63780.html
    2.请您使用克隆实例按时间点恢复方法恢复数据,请您详见:https://help.aliyun.com/document_detail/96147.html
    
    请您考虑开启SQL洞察功能查看实例的操作记录,SQL审计日志:记录对数据库执行的所有操作。通过审计日志记录,您可以对数据库进行故障分析、行为分析、安全审计等操作。
    SQL洞察开启后才可查看相关记录。
    请您详见:https://help.aliyun.com/document_detail/96123.html
    
    ============================
    
    阿里云售后提示您:
    对于涉及到数据的增删改查等测试,建议您先通过控制台或其他方式备份,或者创建一个新的测试环境,以免误操作带来的生产环境数据丢失风险!
    感谢您对阿里云的支持  
    

    数据丢失分成2种情况

    1. 少部分数据被删除可以通过上面的DMS数据追踪功能恢复数据来恢复
    2. 数据库被删除只能用上面的第二种方法克隆实例按时间点恢复方法恢复数据来恢复

    我是最惨的第二种情况。

    处理

    • 已经确认数据被删除了,网站挂上维护公告,让项目处于维护模式不能有新数据写入,关闭队列、定时任务等
    • 使用RDS左边的SQL洞察功能查找数据库被删语句的时间
    • 按照教程使用克隆实例按时间点恢复方法恢复数据操作:
      1. 进入出事RDS的管理界面
      2. 在左侧导航栏中,选择备份恢复
      3. 在页面右上角,单击数据库恢复(原克隆实例)
      4. 在弹出的页面中,选择新实例的计费方式(建议选择按量付费)
      5. 选择上面找出来的执行删库的时间,提前一秒
      6. 单击立即购买。
      7. 勾选《关系型数据库 RDS服务条款》,单击去支付,完成支付即可。
      8. 然后在RDS列表就看到一个新的RDS启动中
      9. 最后要非常有耐心的等待启动完成(我在这等了2个小时左右,大概150GB数据,仅供参考)
    • 条件允许的情况下,把需要恢复的RDS数据库主库的CPU配置买高点,CPU直接影响恢复速度!!!
    • 启动完成后的RDS数据就是刚才选择时间的数据
    • 然后进行数据库迁移
      1. 进入数据传输(DTS)控制台
      2. 在左侧导航栏中,选择数据迁移
      3. 单击创建迁移任务。
      4. 源数据库信息选择刚启动的RDS 数据库账号密码和出事的RDS一样,需要高权限账号 点击测试链接
      5. 目标数据库信息选择出事的RDS 密码同上 点击测试链接
      6. 单击授权白名单并进入下一步。
      7. 只选择结构迁移和全量数据迁移。 不要勾选增量迁移!
      8. 在左侧的迁移对象框中,选择要迁移的对象,单击>将这些对象移入已选择对象框框中。 选择你要恢复的数据库
      9. 开始迁移,弹出选择框,选择迁移最大的规格。(越大速度越快)
      10. 耐心等待进度条,我这边80GB的数据等了5小时
    • 数据迁移成功可以用数据追踪功能 查看删库最后几条sql是否被成功恢复。
    • 测试项目是否恢复正常

    最后

    发生这种事情可以提前制定跑路计划,提前购买人身意外险,如果数据库失败可以按计划执行。?

    展开全文
  • 命令行建库
  • 添加和​​除要跟踪的存储(编辑 .gmconfig 文件)将在未来版本中通过界面进行 文件说明 git-manager-gui.py:交互式管理器 - 基于诅咒 .gmconfig :git manager gui 现在通过 ~/.gmconfig 文件进行配置。 - ...
  • SqlServer删除

    2019-11-04 16:50:35
    报错详情: SQL Server无法删除数据库XXX,因为该数据库当前正在使用。 出现原因: 有其它进程在占用该数据库。 步骤: 1、挨个杀掉占用进程。...SET @dbname = 'databasename' --这个是要删除的数据库库名 ...
  • 1. 本地git关联远程 git remote add origin git@server-name:path/repo-name.git  2.  第一次推送master分支的所有内容 git push -u origin master (第一次要有参数-u,以后提交不用加)  此后,可以...
  • MySQL数据库基本使用 1. 数据库介绍 1.1 什么是数据库 数据的仓库,职责是:管理数据和存取数据 1.2 什么是数据 世界万事万物都可以描述成数据,比如一个人、一辆车、一套房,都可以用一条或多条数据来描述 ...
  • Github 批量删库 取消 star 工具 安装 git clone https://github.com/fwgood/gitdrop yarn add 或 npm install 用法 配置 在 config.json中配置用户名密码 { "username": "", "password": "" } 获取列表 命令行...
  • 1、安装git 2、cd 切换目录到你的项目根目录下(项目根目录,懂...4、使用git config 配置签名(即作者名与作者邮箱,这样在git本地中就可以知道是谁提交的),有两种情况: 注意:(1)与(2)必须存在至少一个。...
  • 提到 Linux 命令,可能都逃脱不了关于删库跑路的那个梗。 sudo rm -rf /* 为什么题目我起的是终于知道什么程序员都喜欢删库跑路了呢?因为今天我给大家推荐的是一个关于 Linux 命令的网站: commandlinefu 。 它非常...
  • Git代码统计(命令行统计)

    千次阅读 2018-05-24 10:28:31
    3、按人员统计增行数 git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } ...
  • 前两天微盟遭遇程序员删库,直接损失10几个亿,这个事件一度上了热搜,大家都在猜测他删库的原因,网上众说纷纭,各种支招。 这两天我还知道了另一个程序员删库的事情,理由竟然是因为他失恋,再加上工作技能要求...
  • Git使用详细教程

    万次阅读 多人点赞 2018-01-02 15:41:45
     SVN是集中式版本控制系统,版本是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本...
  • I'm trying to drop my database and create a new one through the command line. 我正在尝试删除我的数据库并通过命令行创建一
  • Linux运维工程师学习成长路线

    万次阅读 多人点赞 2019-12-14 20:52:46
    当调查人员告诉他们科幻电影中展示黑客高超技巧时的命令行界面,正是大多数运维工程师每日工作环境时,他们发出极其一致的惊叹。相对于普罗大众的一无所知,技术圈对运维的态度则更偏向于黑色幽默。相...
  • 点击上方“菜鸟学Python”,选择“星标”公众号重磅干货,第一时间送达来源:扩展迷EXTFANS大家应该还记得,在今年 2 月份的时候,国内一则程序员删库的消息传遍了全网。这则消息刷屏...
  • 测试开发笔记

    万次阅读 多人点赞 2019-11-14 17:11:58
    配置管理流程 88 3.SVN实战 88 配置管理工具SVN操作过程手册 90 一、 如何创建“project”项目版本 90 二、 如何查看创建的“project”项目版本 95 三、 在版本浏览器里面,创建文件,并进行检出 99 四、 如何对...
  • ORACLE命令行删除数据库你会么

    千次阅读 2018-12-11 10:51:33
    一、环境描述周五要给客户讲11g OCP,提前做一个删除数据库测试,记录如下,知识点大家自己get吧~。工作和讲课真的是有很大区别,要对各种知识点知其然,还要知其所以然,理论要求高的多。加油!...
  •  5、删除数据库(一个实例就一个,命令不用写库名) drop database; 6、将/etc/oratab里面对应的记录注释或者删除掉 ,否则创建相同sid的数据库时会提示: [FATAL] [DBT-10317] Specified SID Name (sidname) ...
  • 1 ,特点 : 面向主题 ( 使用数据时,关心的方向 ) 多方集成 ( 数据来自很多方面 ) 不可改变 ( 我们不会做 update 操作,只做查询 ) 2 ,进入命令行 : ...6 ,删库 : drop database aa; 7 ,使用库 : ...
  • 参考:https://blog.csdn.net/qq_26733915/article/details/80461257
  • 当时为了完全静态的zip苦苦寻找,后来自己编译了一个zip,一个unzip,及这个7za,源码网上都有的,当时网上大部分的zip都需要另外的共享,反正我的830手机不能用,我放的这三个都是完全静态的,应该适合大部分安卓...
  • Redis是用C语言实现的,一般来说C语言实现的程序“距离”操作系统更近,执行速度相对会更快。...本文比较详细且全面的梳理了Redis使用过程中涉及的全部增改查! 1.字符串 1.设置键 set key value [e...
  • Mysql经典高逼格/命令行操作(速成)

    千次阅读 多人点赞 2019-03-31 02:13:37
    由于要学习搭建服务器和数据库,所以最近...经过简单的决定之后,就用逼格极高的cmd命令行来写了。Mysql数据库的安装方法这里就不给出详细的教程了,网上有好多安装教程可以自行选择安装。 1.第一步,我们要先在My...
  • C#基础教程-c#实例教程,适合初学者

    万次阅读 多人点赞 2016-08-22 11:13:24
    在.NET中这些组件或动态联接不必在注册表中注册,每个程序都可以使用自带的组件或动态联接,只要把这些组件或动态联接放到运行程序所在文件夹的子文件夹bin中,运行程序就自动使用在bin文件夹中的组件或动态...
  • SourceTree 命令行代码

    2020-11-23 16:45:56
    1.git remote update origin --prune // 拉取/更新远程分支 2.git fetch --unshallow // 拉取履历 3.git checkout dev // 切换到'dev'分支 4.git checkout -b dev // 创建并...6.git branch -d dev //删除'dev'分支(
  • SDN

    千次阅读 多人点赞 2017-06-29 11:35:37
    需要在设备上面人工手动,基于命令行来进行配置。 静态的网络配置导致了什么问题? 1)可管理性差 2)核心的可拓展性差 需要对付一个比较大的网络(有许多的交换机,路由器以及服务器)的时候,比如需要一...
  • Git命令行

    千次阅读 2018-08-25 11:41:12
    *创建空的分支:(执行命令之前记得先提交你当前分支的修改,否则会被强制干净没得后悔) $git symbolic-ref HEAD refs/heads/[name] $rm .git/index $git clean -fdx   3)版本(tag)操作相关命令 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,564
精华内容 13,425
关键字:

删库命令行