三、MySQL数据管理
1.外键
例:学生的grade列引用年级表的id(约束)。
方式一:在创建表的时候,增加约束(比较复杂)。
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 IF NOT EXISTS `student` (
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`gradeid` INT(10) NOT NULL COMMENT '年级',
PRIMARY KEY (`id`),
--定义外键key
KEY `FK_gradeid` (`gradeid`),
--给此外键添加约束(执行引用),用references引用
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
注:删除有外键关系的表的时候,必须要先删除引用别人的表(从表),再删除被引用的表(主表)。
可视化里查看外键:右击表——>改变表——>选择3个外部键
方式二:创建表成功后,添加外键约束。
--创建表的时候没有外键关系
--ALTER TABLE 表` ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的列) REFERENCES 被引用的表(其字段);
ALTER TABLE `student` ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);
以上的操作都是物理外键,数据库级别的外键,不建议使用。(避免数据库过多造成困扰)
最佳实践:
①数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)。
②想使用多张表的数据,想使用外键(用程序去实现)。
2.DML语言
数据库的意义:数据存储、数据管理。
DML语言:数据操作语言
Insert、update、delete
3.添加(insert)
语法:
insert into 表名([字段名1,字段名2,…]) values[('值1',…),('值2',…),……]
例:
INSERT INTO `student`(`name`,`pwd`,`sex`)
VALUES('张三','aaaa','男'),('李四','bbbb','女')
注:由于主键自增可以省略。(但如果不写表的字段,它会一一匹配。)
一般写插入语句,一定要使数据和字段一一对应。
注意事项:
①字段和字段直接使用英文逗号,隔开。
②字段是可以省略的,但后面的值必须要是一一对应的,不能缺少。
③可以同时插入多条数据,VALUS后面的值,使用,隔开。
4.修改(update)
语法:
UPDATE 表名 set colnum_name = value,[colnum_name = value,…] where [条件]
例:
UPDATE `student` SET `name`='王五',`email`='[email protected]' WHERE id = 1;
注:①不指定条件的情况下,会改动整个表。
②修改多个属性用逗号,隔开。
条件:where 子句(等于某个值,小于或大于某个值,在某个区间内修改…)
操作符:返回布尔值
操作符 | 含义 |
---|---|
= | 等于 |
<>或!= | 不等于 |
> | 大于 |
< | 小于 |
<= | 小于等于 |
>= | 大于等于 |
BETWEEN…AND… | 在某个范围内 |
AND | 和 |
OR | 或 |
例:
--通过多个条件定位数据
UPDATE `student` SET name='长江' WHERE `name`='张三' AND `sex`='男'
注意:①column_name是数据库的列,尽量带上``。
②作为筛选的条件吗,如果没有指定,则会修改所有的列。
③value是一个具体的值,也可以是一个变量。
例:
UPDATE `student` SET `birthday`=CUPPENT_TIME WHERE `name`='张三' AND `sex`='男'
④多个设置的属性之间,使用英文逗号,隔开。
5.删除(delete、truncate)
1)delete命令
语法:
delete from 表名 [where条件]
例:
DELETE FROM `student` WHERE id=1;
注:若无指定的条件,会全部删除,避免这样写。
2)truncate命令
作用:完全清空一个数据表,表的结构和表的索引不会变。
例:
--清空student表
TRUNCATE `student`
TRUNCATE TABLE `student`
2)delete和truncate的区别
相同点:都能删除数据,且不会删除表的结构。
不同点:TRUNCATE会重新设置自增列,计数器会归零,且不会影响事务。
例:
--测试delete和truncate区别
CREATE TABLE `test` (
`id` INT(4) NOT NULL AUTO_INCREMENT,
`coll` VARCHAR(20) NOT NULL,
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO `test`(`coll`) VALUES('1'),('2'),('3')
DELETE FROM `test` --不会影响自增
TRUNCATE TABLE `test` --自增会归零
DELETE删除的问题:
InnoDB:自增列会重新从1开始(存在内存当中的,断电即失)。
MyISAM:继续从上一个自增量继续(存在文件中的,不会丢失)。