MySQL学习笔记(三)------MySQL数据管理
外键(了解)
概念
如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。
在实际操作中,将一个表的值放入第二个表来表示关联,所使用的值是第一个表的主键值(在必要时可包括复合主键值)。此时,第二个表中保存这些值的属性称为外键(foreign key)。
作用
- 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据,约束。
- 使两张表形成关联,外键只能引用外表中的列的值或使用空值。
创建外键
-
年级表 (id\年级名称)
-
学生信息表 (学号,姓名,性别,年级,手机,地址,出生日期,邮箱,身份证号)
-
学生表的gradeid字段,要去引用年纪表的gradeid
-
定义外键key,给这个外键添加约束(执行引用)
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
方式一:在创建表的时候,增加约束(麻烦,比较复杂)
CREATE TABLE `grade` (
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级ID',
`gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
PRIMARY KEY (`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
CREATE TABLE `student` (
`studentno` INT(4) NOT NULL COMMENT '学号',
`studentname` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`sex` TINYINT(1) DEFAULT NULL COMMENT '性别',
`gradeid` INT(10) DEFAULT NULL COMMENT '年级',
`phoneNum` VARCHAR(50) NOT NULL COMMENT '手机',
`address` VARCHAR(255) DEFAULT NULL COMMENT '地址',
`borndate` DATETIME DEFAULT NULL COMMENT '生日',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
`idCard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',
PRIMARY KEY (`studentno`),
KEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
方式二:创建表的时候没有外键关系,修改子表添加外键
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`);
ALTER TABLE [表名]
ADD CONSTRAINT `FK_[外键字段名]` FOREIGN KEY ([作为外键的列]) REFERENCES [哪个表] ([哪个字段]);
以上操作都是物理外键,数据库级别的外键,不建议使用(避免数据库过多造成困扰)
删除外键
- 删除有外键关系的表的时候,必须先删除引用别人的表(从表),再删除被引用的表(主表)
最佳实践
- 数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)
- 想利用多张表的数据,想使用外键的时候,用程序去实现
DML语言(背)
数据库的意义:
- 数据存储
- 数据管理
添加
语法
-
插入语句(添加)
insert into [表名]([字段1],[字段2],...) values('值1','2',...),('值2','',...),('值3','',...),(...) insert into `grade`(`gradename`) values('大一'),('大二') INSERT INTO `student`(`studentname`,`studentno`,`phoneNum`) VALUES('张三','123','1532222'),('李四','552','1875555')
注意事项
-
如果不写表的字段就会一一匹配(按顺序)
-
一般写插入语句,一定要数据和字段一一对应
-
字段可以省略,但是后面的值一定要和表顺序一一对应,不能少
-
可以同时插入多条数据,values后面的值需要使用,隔开
修改
语法
uodate [表名] set [字段名1]='[修改后的值]',[字段名2]='[修改后的值]',... where [条件]
UPDATE `student` SET `studentname`='赵四' WHERE `studentno`=552;
UPDATE `student` SET `studentname`='赵四',`sex`='男' WHERE `studentno`=552;
- 条件:where子句,运算符
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | 5=6 | false |
<>或!= | 不等于 | 5<>6 | true |
> | 大于 | 5>6 | false |
< | 小于 | 5<6 | true |
>= | 大于等于 | 5>=6 | false |
<= | 小于等于 | 5<=6 | true |
between…and… | 在某个范围内 | [2,5] | |
and | A和B && | 5>1 and 1>2 | false |
or | A或B || | 5>1 or 1>2 | true |
注意事项
- 可以通过多个条件定位数据,无上限
- colnum_name:数据库的列,尽量带上``
- 条件,筛选的条件,如果没有指定,则会修改所有的列
- current_time:当前的时间
- value,是一个具体的值,也可能是个变量(基本只有时间会用到变量,大多数为具体的值)
- 多个设置的属性之间使用英文逗号隔开
删除
语法
- delete命令
delete from [表名] where[条件]
DELETE FROM `student` WHERE `studentno`=123
-- 直接写delete from [表名] 没有约束条件时,会全部删除,不要这样写
- truncate命令
- 作用:完全清空一个数据库表,表的结构和索引约束不会变
truncate [表名]
TRUNCATE `student`
delete和truncate的区别
-
相同点:都能删除数据,都不会删除表结构
-
不同点:
truncate重新设置自增列,计数器会归零,不会影响事务
delete不会影响自增
-
delete删除的问题,重启数据库,现象:
InnoDB 自增列会从1开始(存在内存中,断电即失)
Myisam 继续从上一个自增量开始(存在文件中,不会丢失)
表结构
-
不同点:
truncate重新设置自增列,计数器会归零,不会影响事务
delete不会影响自增
-
delete删除的问题,重启数据库,现象:
InnoDB 自增列会从1开始(存在内存中,断电即失)
Myisam 继续从上一个自增量开始(存在文件中,不会丢失)