day11 - MySQL数据管理(DML增删改)

MySQL数据管理

外键

物理外键(避免使用)

物理外键会导致数据库过多造成困扰

方式一:在创建表的时候,增加约束(麻烦,比较复杂)

USE `school`;
CREATE TABLE IF NOT EXISTS `grade` (
`gradeid` INT(4) NOT NULL AUTO_INCREMENT COMMENT '年级id',
`gname` VARCHAR(20) NOT NULL COMMENT '年级名称',
PRIMARY KEY (`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

-- 学生表的gid字段,要去引用年级表的gradeid
-- 定义外键key
-- 给这个外键添加约束(执行引用) references 引用
CREATE TABLE IF NOT EXISTS `student` (
`id` INT(10) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(5) NOT NULL COMMENT '姓名',
`gid` INT(4) NOT NULL COMMENT '年级',
`age` INT(3) NOT NULL COMMENT '年龄',
`sex` VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '性别',
`date` DATETIME DEFAULT NULL COMMENT '入学时间',
PRIMARY KEY(`id`),
KEY `FK_gid` (`gid`),
CONSTRAINT `FK_gid` FOREIGN KEY (`gid`) REFERENCES `grade` (`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

 

删除有外键关系的表的时候,必须要先删除引用别人的表(从表),再删除被引用的表(主表)

 

方式二:创建表成功后,添加外键约束

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

最佳实践

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

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

 

【强制】不得使用外键与级联,一切外键必须在应用层解决

 

DML语言(重点)

DML语言:数据操作语言

  • insert

  • update

  • delete

 

添加(insert)

-- 插入语句(添加)
-- insert into 表名([字段名1,字段2,字段3]) values(‘值1’),(‘值2’),(‘值3’), ....)
INSERT INTO `grade`(`gname`) VALUES('大一')

-- 由于主键自增,我们可以省略(如果不写表的字段,他就会一一匹配)
-- 一般写插入语句,我们一定要数据和字段一一对应
INSERT INTO `grade`(`gname`) VALUES('大二'),('大三'),('大四')

INSERT INTO `student`(`name`,`gid`,`age`) VALUES('张三','3','20')
-- 添加多个数据
INSERT INTO `student`(`name`,`gid`,`age`,`sex`)
VALUES('小丽','2','19','女'),('小明','2','19','男')

注意事项:

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

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

INSERT INTO `student`
VALUES(1,'张三',32','20','男',‘2017-09-01’)
  1. 可以同时插入多条数据,VALUES后面的值需要用英文逗号隔开

 

修改(update)

update 修改谁 (条件) set 原来的值=新的值

-- 语法:
-- UPDATE `表名` SET `colnum_name`=value,[`colnum_name`=value, ...] WHERE [条件];

-- 修改学生名字,带条件
UPDATE `student` SET `name`='大明' WHERE id = 3;
-- 修改学生名字,不指定条件,会改动所有的表,慎用,最好不用
UPDATE `student` SET `name`='大明'

-- 修改多个属性
UPDATE `student` SET `name`='大明',`gid`=4 WHERE id = 3;

条件:where子句 运算符 id等于某个值,大于某个值,在某个区间内修改...

操作符:返回布尔值

操作符含义实例结果
= 等于 5=6 false
<>或!= 不等于 5<>6 true
> 大于    
< 小于    
>= 大于等于    
<= 小于等于    
between...and... 闭合区间 between 2 and 5  
and 5>1 and 1<2 false
or 5<1 or 3>2 true
-- 通过多个条件定位数据,无上限
UPDATE `student` SET `name`='大明' WHERE `id` = 3 AND `sex` = '女';

UPDATE `student` SET `name`='大明'WHERE `gid` BETWEEN 2 AND 4;

语法:UPDATE 表名 SET colnum_name=value,[colnum_name=value, ...] WHERE [条件];

注意:

  • colnum_name 是数据库的列,尽量带上``

  • 条件,筛选的条件,如果没有指定,则会修改所有的列

  • value,是一个具体的值,也可以是一个变量

UPDATE `student` SET `date` = CURRENT_TIME WHERE id = 1;
  • 多个设置属性之间,使用英文逗号隔开(trim标签可以让多余的逗号消除)

 

删除(delete)

delete命令

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

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

 

TRUNCATE命令

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

-- 清空student表
TRUNCATE `student`

 

delete与truncate的异同

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

  • 不同:

    • truncate:重新设置自增列,计数器归零,不会影响事务

    • delete:不重置自增

delete删除问题(重启数据库的现象):

  • innoDB:自增列会从1开始(存在于内存中,断电则失)

  • MyISAM:继续从上一个自增量开始(存在于文件中,不会丢失)

posted @ 2020-10-27 21:56  NSFW  阅读(98)  评论(0)    收藏  举报