day11 - MySQL数据管理(DML增删改)
外键
物理外键(避免使用)
物理外键会导致数据库过多造成困扰
方式一:在创建表的时候,增加约束(麻烦,比较复杂)
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','男')
注意事项:
-
字段和字段之间使用英文逗号隔开
-
字段可以省略,但是后面的值必须要一一对应,例如:
INSERT INTO `student`
VALUES(1,'张三',32','20','男',‘2017-09-01’)
-
可以同时插入多条数据,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开始(存在于内存中,断电则失)
-
浙公网安备 33010602011771号