12-MySQL索引和外键

2019-01-08  本文已影响0人  喝酸奶要舔盖__

索引

示例一:
create table test1(
    id int,
    name varchar(20),
    index idx_name(name) #创建索引
);

create table test2(
    id int,
    name varchar(20),
);
create index idx_name on test2(name); #创建索引

create table test3(
    id int,
    name varchar(20),
);
alter table test3 add index idx_name(name);

示例二:
create table test4(
    id int,
    name varchar(20),
    unique index idx_name(name) #创建索引
);

create table test5(
    id int,
    name varchar(20),
);
create unique index idx_name on test5(name); #创建索引

create table test6(
    id int,
    name varchar(20),
);
alter table test6 add unique index idx_name(name);


4.删除索引
drop index idx_name on test6

数据完整性

name score
lnj  100
lnj  100

解决方案:
- 添加主键约束
id name score
1  lnj  100
2  lnj  100

- 添加唯一键约束
name score
lnj  100
zq  100

- 自动增长列
id name score
1  lnj  100
2  lnj  100
id name score
1   lnj  100
2   zq   null
2   zq   tyt

- 数据类型约束
id name score
1   lnj  100
2   zq   null
2   zq   0

解决方案:

- 非空约束
id name score
1   lnj  100
2   zq   0
2   zq   0

- 默认值约束
id name score
1   lnj  100
2   zq   59.5
2   zq   0

外键

例如: 成绩表中的stuid引用了学生表中的id, 那么stuid我们就称之为外键
注意点:  成绩表中的stuid引用了学生表中的id, 那么成绩表我们称之为"从表", 学生表称之为主表
示例二:
create table stugrade2(
    id int auto_increment primary key,
    stuid int,
    score float,
    #告诉MySQL将stuid作为外键, 值是引用stuinfo中的id
    foreign key(stuid) references stuinfo(id)
);
insert into stugrade2 values(null, 3, 100); #报错, 因为sutinfo中没有id为3的人
insert into stuinfo values(null, 'lnj');
insert into stugrade2 values(null, 3, 100); #报错, 因为sutinfo中没有id为3的人
insert into stugrade2 values(null, 1, 100);
delete from stuinfo where id=1; #报错, 因为有其它表引用这这条数据
- 严格模式(默认)
    + 主表不存在对应的数据, 从表不允许插入
    + 从表引用着主表的数据, 主表不能删除
    + 从表引用着主表的数据, 主表不能修改
- 置空操作
    + 如果主表中的数据被删除了, 从表中对应的字段变为null, 我们就称之为置空操作
    + 流入: 主表中id为1的人被删除了, 那么从表中的stuid变为null
- 级联操作
    + 如果主表发生了变化, 从表也跟着变化, 我们就称之为级联操作
    + 例如: 主表中'lnj'的id从1变为3, 那么从表中的stuid也从1变为3

- 格式:
     foreign key(字段) references 主表名(主表主键)[主表删除的动作][主表更新的动作]

示例一:
create table stugrade(
    id int auto_increment primary key,
    stuid int,
    score float,
    #注意点: 一般在企业开发中都是删除就清空, 更新就随着更新
    foreign key(stuid) references stuinfo(id) on delete set null on update cascade
);
insert into stugrade values(null, 1, 100);
update stuinfo set id=666 where id=1;
delete from stuinfo where id=666;
上一篇 下一篇

猜你喜欢

热点阅读