三、MySQL数据管理

1.外键

例:学生的grade列引用年级表的id(约束)。

学生的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`='2585801995@qq.com' 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 TEBLE `test` --自增会归零
DELETE删除的问题:
InnoDB:自增列会重新从1开始(存在内存当中的,断电即失)。
MyISAM:继续从上一个自增量继续(存在文件中的,不会丢失)。