MySQL数据管理

3.MySQL数据管理

3.1、外键(了解即可)

① 在创建表的时候,增加约束(麻烦,复杂)

-- 注意:这里的表名和字段名可以不加``符号,但是注释的''符号不能少。(你们可以自己试试)
CREATE TABLE `grade` (
  `gradeid` int NOT NULL AUTO_INCREMENT,
  `gradename` varchar(50) NOT NULL,
  PRIMARY KEY (`gradeid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

--学生表的gradeid字段要去引用年级表的gradeid
-- 定义外键key
--给这个外键表约束(执行引用) references 引用

CREATE TABLE IF NOT EXISTS `student` (
    `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
    `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
    `pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
    `sex` VARCHAR(2) NOT NULL DEFAULT '' COMMENT '性别',
    `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
    `gradeid` INT(10) NOT NULL COMMENT '学生的年级',
    `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
    `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY(`id`),
    KEY `FK_gradeid` (`gradeid`),
    CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

② 创建表成功后,添加外键约束

--学生表的gradeid字段要去引用年级表的gradeid
-- 定义外键key
--给这个外键表约束(执行引用) references 引用

CREATE TABLE IF NOT EXISTS `student` (
    `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
    `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
    `pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
    `sex` VARCHAR(2) NOT NULL DEFAULT '' COMMENT '性别',
    `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
    `gradeid` INT(10) NOT NULL COMMENT '学生的年级',
    `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
    `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY(`id`),
) ENGINE=INNODB DEFAULT CHARSET=utf8;

-- 创建表的时候没有外键关系
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`);

--ALTER TABLE `表名`
-- ADD CONSTRAINT `约束名` FOREIGN KEY (`作为外键的列`) REFERENCES `哪个表`(`哪个字段`);

以上的操作都是物理外键,数据库级别的外键,我们不建议使用(避免数据库过多造成的困扰)

最佳实践

  • 数据库就是单纯的表,只用来存数据,只有行数据和列字段

  • 我们想使用多张表的数据,想使用外键的话(一般用程序去实现)

 

3.2、DML语言(全部记住:数据库操作语言)

  • insert 添加

  • update 修改

  • delete 删除

3.3、添加

insert

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

-- 插入语句
INSERT INTO `grade`(`gradename`) VALUES('大四');
INSERT INTO student(name) VALUES('张三')

-- 由于主键自增我们可以省略(如果不写表的字段,它就会一一匹配;当表中除了主键列外只有一个列时可以运行成功,不然就会报错)
INSERT INTO `grade` VALUES('大四')

-- 插入多个字段
INSERT INTO `grade`(`gradename`) VALUES('大二'),('大一');
INSERT INTO student(name,pwd,sex) VALUES ('man','123','');
INSERT INTO `student`(`name`,`pwd`,`sex`)
VALUES ('','111111',''),('','222222','')

注意事项:

  1. 字段和字段之间使用英文逗号隔开

  2. 字段是可以省略的,但是后面的值必须要一一对应

  3. 可以同时插入多条数据,VALUES后面的值需要使用英文逗号隔开即可

 

3.4、修改

update

语法:update 表名 set 列名='xxx',[列名2='xxx',····] where 条件

-- 修改id为1的学生名字
UPDATE `student` SET `name`='小美' WHERE id=1

-- 不指明条件的情况下,会改动所有的表!
UPDATE `student` SET `name`='一样'

-- 修改多个属性时,用逗号隔开
UPDATE `student` SET `name`='小美', `pwd`=123 WHERE id=1

-- 通过多个条件定位数据
UPDATE `student` SET `name`='张三' WHERE `name`='不同' AND `sex`=''

where语句的条件:id等于某个值,大于某个值,或者在某个区间内修改,比如(id>1&&id<10)

操作符会返回布尔值

操作符
含义
范围
结果
=
等于
5=6
false
<>或!=
不等于
5<>6
true
>
大于
6>5
true
<
小于
5<6
true
<=
小于等于
5<=6
true
>=
大于等于
6>=5
true
between...and...
在某个范围内
[5,6]
 
and
和 &&
5>1 and 1>2
false
or
或 ||
5>1 or 1>2
true

注意事项:

  • 表名和列名尽量带上``

  • 条件如果没有指定就会修改整一列的数据

  • 修改多个属性时,用英文逗号隔开

 

3.5、删除

delete

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

-- 删除数据(避免这样写会删除整个表的数据)
DELETE FROM `student`

-- 删除指定数据
DELETE FROM `student` WHERE id=8

truncate 命令

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

-- 清空student表
TRUNCATE `student`

delete 和 truncate 的区别

相同点:都能删除数据,都不会删除表的结构

不同:

  • 使用TRUNCATE会重新设置自增列的数字,即自增列的计数器会归零

  • TRUNCATE 不会影响事务

-- 测试 delete 和 truncate 的区别
CREATE TABLE `test` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `coll` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `test`(coll) VALUES ('11'),('12'),('13'),('14');

原表图:

 

-- 使用delete删除整个表的数据
DELETE FROM `test`;    -- 不会影响自增
-- 然后再次插入数据
INSERT INTO `test`(coll) VALUES ('21'),('22'),('23'),('24');

delete后表图:

-- 使用truncate删除整个表的数据
TRUNCATE `test`;     -- 自增会归零
-- 然后再次插入数据
INSERT INTO `test`(coll) VALUES ('21'),('22'),('23'),('24');

 

truncate后表图:

 

 

冷知识(了解):delete删除完数据后,重启MySQL数据库,主键的计数器会有什么变化?

不同的引擎会有不同的现象:

  • InnoDB 自增列就会从现存记录里最大自增量开始 (原因:数据是存在内存当中的,断电既失)

  • MyISAM 继续从记录里的自增量开始 (原因:数据是存放文件中的,不会丢失)

其实这个问题在mysql8.0之后就修复了

posted @ 2022-07-01 21:36  理暗  阅读(28)  评论(0)    收藏  举报