MySQL数据管理

一---外键(了解即可)

 1 CREATE TABLE `grade`(
 2  `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',
 3  `gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
 4  PRIMARY KEY(`gradeid`)
 5 )ENGINE=INNODB DEFAULT CHARSET=utf8
 6 
 7 -- 学生表的gradeid 字段要去引用年级表的 gradeid
 8 -- 定义外键key
 9 -- 给这个外键添加约束(执行引用) references 引用
10 
11 CREATE TABLE IF NOT EXISTS `student`(
12   `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
13   `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
14   `pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
15   `sex` INT(4) NOT NULL  COMMENT '性别',
16   `birthday` DATETIME DEFAULT NULL  COMMENT '生日',
17   `gradeid` INT(10) NOT NULL  COMMENT '学生的年级',
18   `address` VARCHAR(30) NOT NULL  COMMENT '地址',
19   `email` VARCHAR(30) DEFAULT NULL  COMMENT '邮箱',
20   PRIMARY KEY(`id`),
21   KEY `FK_gradeid` (`gradeid`),
22   CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`)
23 )ENGINE=INNODB DEFAULT CHARSET=utf8
24 
25 -- 创建表的时候没有外键关系
26 ALTER TABLE `student`
27 ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) references `grade`(`gradeid`);
28 
29 -- ALTER TABLE 表
30 ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的列) references 哪个表(哪个字段);

以上的操作都是物理外键,数据库级别的外键,我们不建议使用!(避免数据库过多造成困扰,因为有外键的话想删表删不掉)

最佳方案:

  • 数据库就是单纯的表,只是用来存储数据,只有行(数据)和列(字段)
  • 我们想使用多张表的数据,想使用外键,用程序去实现

阿里编程规范中提到:

  • 【强制】不得使用外键与级联,一切外键必须在应用层解决
  • 每次做delete或者update都必须考虑外键约束,会导致开发的时候很痛苦,测试数据极为不方便

 

 

 

二---DML语言(全部记住并背下来)

 

  • 添加
 1 -- 插入语句(添加)
 2 -- insert into 表名(字段1,字段2,字段3)values('值1','值2', '值3')
 3 INSERT INTO `grade`(`gradename`) 
 4 VALUES('大三')
 5 -- 由于主键自增我们可以省略(如果不写表的字段,他就会一一匹配)
 6 -- 下面的语句会报错,因为匹配的字段是id
 7 INSERT INTO `grade` VALUES(`大三`)
 8 
 9 -- 一般写插入语句,我们一定要数据和字段一一对应
10 
11 -- 插入多个字段
12 INSERT INTO `grade`(`gradename`)
13 VALUES('大二'),
14 ('大一')

语法: insert into 表名(`字段名1`, `字段名2`,`字段名3`)values('值1','值2','值3')

注意事项:

  1. 字段和字段之间使用英文逗号隔开
  2. 字段是可以省略的吗,但是后面的值必须要一一对应,不能少
  3. 可以同时插入多条数据,values后面的值,需要使用,隔开
  4. 由于外键的约束,我们往表里插数据的时候,注意两张表外键的值要一样,否则插入失败

 

  • 修改
1 -- 修改学生名字,带条件
2 UPDATE `student` SET`name`='德胜' WHERE `id`=3
3 
4 -- 修改学生名字不带条件,全改了
5 UPDATE `student` SET`name`='德胜'
6 
7 -- 修改多个属性,逗号隔开
8 UPDATE `student` SET`name`='德胜',`address`='北京' WHERE `id`=3

语法: update 表名 set column_name=value,[column_name=value] where [条件]

条件操作符:

  • <> 或!= 是不等于
  • and连接多个条件

注意事项:

  • colume_name 是数据库的列,尽量带上``
  • 条件,筛选的条件,如果没有指定的话,则会修改所有的列
  • value 是一个具体的值,也可以是一个变量
    1 UPDATE `student` SET`name`='德胜',`address`='北京',`birthday`=CURRENT_TIME WHERE `id`=3

     

  • 删除

 

delete命令

语法:delete from 表名 [where 条件]

1 -- 避免这样写,会全部删除
2 DELETE FROM `student`
3 
4 -- 删除指定数据
5 DELETE FROM `student` WHERE `id`=4

 

TRUNCATE 命令

作用:完全清空一个数据库表,表的结构和索引约束不会变

语法:truncate table 表名


delete和truncate区别

  • 相同点:都能删除数据,都不会删除表结构
  • 不同:
  1. truncate 重新设置 自增列 计数器会归零
  2. truncate 不会影响事务

     

 1 CREATE TABLE `test`(
 2 `id` INT(10) NOT NULL AUTO_INCREMENT,
 3 `coll` VARCHAR(20) NOT NULL,
 4 PRIMARY KEY(`id`)
 5 )ENGINE=INNODB  DEFAULT CHARSET=utf8
 6 
 7 INSERT INTO `test` (`coll`)
 8  VALUES('1'),('2'),('3')
 9  
10  DELETE FROM `test`
11  
12  TRUNCATE TABLE `test`

 

 

 

 拓展:delete删除的问题,重启数据库时候的现象

  • innodb 自增会从1开始(存在内存当中时,断电即失)
  • myisam 继续从上一个增量开始(存在文件中的,不会丢失)

 

posted on 2021-05-10 19:57  Love&Share  阅读(59)  评论(0编辑  收藏  举报

导航