程序员Ping说MySQL

MySQL之MySQL数据管理

2020-11-28  本文已影响0人  Ping开源

三、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 TABLE `test` --自增会归零

DELETE删除的问题
InnoDB:自增列会重新从1开始(存在内存当中的,断电即失)。
MyISAM:继续从上一个自增量继续(存在文件中的,不会丢失)。

上一篇下一篇

猜你喜欢

热点阅读