外键

方式一:在创建表时,增加约束(麻烦,比较复杂)

create table if not exists `grade`(
	`gradeid` int(10)  not null auto_increment comment '年级ID',
	`gradename` varchar(20) not null comment '年级名称',
		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;
  • 删除有外键关系的表的时候,必须要先删除引用别人表的表(从表),再删除被引用的表;
    • 例如:想删除grade表时必须先删除student表

方式二:在创建表时没有外键关系

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 `FX_gradeid` foreign key (`gradeid`) references `grade`(`gradeid`);
-- ALTER TABLE 表 ADD CONSTRAINT  约束名 FOREIGN KEY(作为外键的列) REFERENCES 哪个表(哪个字段)

以上的操作都是物理外键,数据库级别的外键,我们不建议使用,(避免数据库过多造成困扰,了解即可)

==最佳实践==

  • 数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)
  • 我们想使用多张表的数据,想使用外键:程序去实现

DML语言(全部记住)

数据库意义: 数据存储,数据管理

DML语言:数据操纵语言

  • insert
  • update
  • delete

添加

insert


-- 插入语句(添加)
-- insert into 表名(字段名,字段名,...) values (值1),(值2),(值3),...
insert into `grade`(`gradename`) values ('大四');

-- 由于主键自增我们可以省略,(如果不写表的字段,他会一一匹配)
insert into `grade` values ('大三'); -- 因为一一对应,所以报错
-- 改正
insert into `grade` values (2,'大三');

-- 一般写插入语句,我们一定要数据和字段一一对应

-- 插入多个字段
insert into `grade`(`gradename`)
values ('大二'),('大一');


insert into `student`(`name`) values ('张三');

insert into `student`(`name`,`pwd`,`sex`) values ('小明','爱大爱','男');


insert into `student`(`name`,`pwd`,`sex`) 
values ('小明1','asdas','男'),('小dong','asdadas','女');

语法:insert into 表名(字段名,字段名,...) values (值1),(值2),(值3),...

注意事项:

  • 字段和字段之间用英文 逗号隔开
  • 字段是可以省略的,但是后面的值必须一一对应,不能少
  • 可以同时插入多条数据,values后面的值,需要使用,隔开即可values (值1),(值2),(值3),...

修改

update 修改谁(条件) set 字段名 = 新值

-- 修改学生名字
update `student` set `name`='kuangshen' where id=1;

-- 不指定条件的情况下,会改动所有表
update `student` set `name`='小明';

-- 修改多个属性 逗号隔开 
update `student` set `name`='xixix',`sex`='男' where id=1;

-- 语法
-- update `表名` set colunm_name=value,[colunm_name=value,...] where 条件;

条件: where 子句 运算符 id等于某个值,大于某个值,在某个区间内修改

操作符会返回 布尔值

操作符 含义 范围 结果
= 等于 id=5
<> 或 != 不等于 id<>6
> 大于 id>6
< 小于 id<6
<= 小于等于 id<=6
>= 大于等于 id>=5
between … and … 在范围之间(闭区间) [1,4]
and A和B && 5>1 and 3>1 true
or A或B|| 5>1 or 3<1 true
-- 通过多个条件来定位数据
update `student` set `sex`='x' where `name`='小明' and `sex`='女';

语法:update 表名 set colunm_name=value,[colunm_name=value,...] where 条件;

注意:

  • column_name 是数据的列,尽量带上``
  • 条件,筛选的条件,如果没有指定,则会修改所有的列
  • value是一个具体的值,也可以是一个变量
update `student` set `birthday`=current_time where `name`='小明' and `pwd`='asdas';

删除

delete 命令

语法:delete from 表名 [where 条件]

-- 删除数据(避免这样写,会全部删除)
delete from `student`;

-- 删除指定数据
delete from `student` where id=1;

truncate 命令

作用:完全清空一个数据表,表的结构和索引约束不会变!

delete 和 truncate 的区别

  • 相同点:都能删除数据,,都不会删除表结构
  • 不同点:
    • truncate 重新设置 自增列 计数器会归零
    • truncate 不会影响事务
-- 测试 delete 和 truncate 的不同
create table `test` (
	`id` int not null auto_increment,
	`coll` varchar(20) not null,
	primary key(`id`)
)engine=Innodb default charset=utf8;

insert into `test` (`coll`) values('das');

delete from `test` ;  -- 不会影响自增

truncate table `test`;  -- 自增重新从1开始计算

了解即可:DELETE删除的问题 ,重启数据库,现象

  • INNODB :自增列会从1开始,(自增列的计数存在内存中,断电即失)
  • MYISAM :继续从上一个自增量开始(存在文件中,不会丢失)