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','女')
注意事项:
-
字段和字段之间使用英文逗号隔开
-
字段是可以省略的,但是后面的值必须要一一对应
-
可以同时插入多条数据,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 继续从记录里的自增量开始 (原因:数据是存放文件中的,不会丢失)