mysql3
MySql
1.数据的完整性
1.实体的完整性:一个实体就是一条记录,如果记录无法区分,称之为失去了数据的完整性.
2.域完整性:如果两个字段无法区分,称之为失去了域的完整性.
3.引用的完整性:两个表的对应记录不完整.(不可避免的)
4.自定义完整性:自己制定的规则在实现后出现了偏差.
user
id | usename | pwd |
---|---|---|
1 | 123456@qq.com | 123456 |
3 | 654321@qq.com | 123456 |
userinfo
uid | name | sex | idcard | age | num |
---|---|---|---|---|---|
2 | 王大恒 | 男 | 不祥 | 18 | 1 |
19 | 贾乃亮 | 男 | 不详 | 32 | 2 |
select * from user left join userinfo on user.id=userinfo.num;
(1).保证实体的完整性
1.自动增长列(auto_increment)
2.主键的约束(primary key)
3.唯一键(unique)
(2).保证域的完整性
1.数据类型的约束
2.默认值约束
3.非空的约束
(3)保证引用的完整性
建立外键->只用主表有的,从表一定会有(从表中还不能删除)
(4)自定义完整性
1.存储过程(比较像python的自定义函数)
2.触发器
2外键(foreign key)
外键:从表的公共字段
外键约束用来保证引用的完整性,主外键的名字可以不一样,但是数据类型必须一样.
特点:
1.主表中不存在的记录,从表中不能插入
2.从表中存在记录,主表中不能先删除
3.必须先删除从表,再删除主表
(1)创建外键
--学生表(主表)
create table stuinfo(
id int auto_increment comment'主键',
stu_name varchar(255),
primary key(id)
)engine=innodb;
#添加一条数据
insert into stuinfo set `stu_name`='王大恒';
--成绩表(从表)
create table stumarks(
stuno int comment'主键',
ch float,
math float
#foreign key(stuno) references stuinfo(id)
#foreign key (stuno) references stuinfo(id) on delete set null on update cascade
)engine=innodb;
#修改表的时候添加一个外键
修改 表 成绩表 增加 外键 学号 关联 学生信息表的id字段
alter table stumarks add foreign key (stuno) references stuinfo(id);
#当主表删除 从表设置为空(指的是外键字段)
#on delete set null
#当主表删除 从表中整条数据跟着删除
#on delete set cascade
#当修改主表时 从表的关联字段也跟着修改
#on update cascade
alter table stumarks add foreign key (stuno) references stuinfo(id) on delete set null on update cascade;
#添加一条数据
insert into stumarks values(1,88,99);
mysql> show create table stumarks\G
*************************** 1. row ***************************
Table: stumarks
Create Table: CREATE TABLE `stumarks` (
`stuno` int(11) NOT NULL COMMENT '主键',
`ch` float DEFAULT NULL,
`math` float DEFAULT NULL,
PRIMARY KEY (`stuno`),
CONSTRAINT `stumarks_ibfk_1` FOREIGN KEY (`stuno`) REFERENCES `stuinfo`(`id`) on delete set null on update cascade ;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)
#CONSTRAINT `stumarks_ibfk_1`:是mysql分配给外键的名字
#指定一个名字给外键(添加一个索引)
alter table stumarks add CONSTRAINT `stuno` foreign key (stuno) references stuinfo(id) on delete cascade on update cascade;
#删除外键
alter table stumarks drop foreign key stumarks_ibfk_1;
#提醒:
如果要在某个字段上添加外键,这个字段必须有索引才可以,如果这个字段没有索引就直接添加外键,那么mysql会自动创建索引.
(2)外键的操作
1.严格约束(外键约束),保证引用的完整性
2.置空操作(set null):主表记录删除或者更新,从表的外键字段设置为null
3.联级操作(cascade): 主表的记录删除或者更新,从表外键字段一起发生变化
4.一般都是删除的时候外键字段置空,修改的时候更新关联
alter table stumarks add foreign key (stuno) references stuinfo(id) on delete set null on update cascade;
注意:`从表的关联(外键)字段一定不能是主键`
外键在数据量特别小的时候会用上,一般是开发者自己清楚数据库表的设计,你知道那个是主表,那个是从表,然后手动修改,使用'事务',为什么了?
1.mysql表中设置外键会影响效率.
2.一般来说,每个从表都是单独数据,需要用到单独操作.
3.实体之间的关系
什么是实体?
我们所看到的每一条记录就是一个实体.