1.primary key主键
从约束角度上而言 primary key主键 等价于非空且唯一 not rull unique
create table a1( id int primary key, name varchar(32) );InnoDB存储引擎规定一张表必须且只有一个主键;如果创建的表中没有主键但是有非空且唯一的字段那么InnoDB存储引擎会自动将该字段设置为主键;如果创建的表中没有主键也没有非空且唯一的字段 那么InnoDB存储引擎会自动采用一个隐藏的字段作为主键(主键可以快速查询数据)
create table a2( nid int not null unique, sid int not null unique, name varchar(32) ); id int primary key :单列主键 primary key(nid,sid) :联合主键2.auto_increment自增
配合主键一起使用必须跟在键后面不能单独使用
create table a3( id int primary key auto_increment, name varchar(32) );ps:自增小知识
自增的操作不会因为执行删除数据的操作导致id回退或者重置
如果要重置主键 则需要格式化表:truncate 表名;
1.外键的作用与目的
外键字段用来记录表与表之间的数据关系;保持数据一致性,完整性,主要目的是控制存储在外键表中的数据,使两张表形成关联。
2.外键字段的创建
2.1 先通过‘换位思考’来判断数据的四种关系
一对多关系 多对多关系 一对一关系 没有关系
例如:一对多关系
2.2 Foreign Key外键
先创建被关联的表 再创建关联表
create table user( id int primary key auto_increment, name varchar(32) gender enum('female','male') default 'male', dep_id int, foreign key(dep_id) references dep(career_id) ); create table career( career_id int primary key auto_increment, career_name varchar(32) );○ 插入表数据的时候外键字段只能填写被关联表字段已经出现过的数据值
○ 被关联的字段无法修改和删除操作性不强
2.3 级联更新、级联删除
将关联的两个表数据同步变动
create table user( id int primary key auto_increment, name varchar(32), gender enum('male','female') default 'male', dep_id int, foreign key(deo_id) references career(career_id) on update cascade on delete cascade ); create table career( id int primary key auto_increment, career_name varchar(32) );○ 因为表联合使用增加了表之间的耦合度 增加资源的消耗,我们可以通过自己写SQL来建立代码层面的关系
3.表关系之多对多
表一数据可以对应多条表二数据,表二也可以对应多条表一数据
create table a1( id int primary key auto_increment, title varchar(32) ); create table a2( id int primary key auto_increment, name varchar(32) ); create table a3( id int primary key auto_increment, book_id int, foreign key(book_id) references a1(id) on update cascade on delete cascade author_id int, foreign key(author_id) references a2(id) on update cascade on delete cascade );○ 多对多表关系外键字段不能建在任意一方需要再建一个新的表
4.表关系之一对一
如果表一与表二没有两边都不可以 则先考虑两张表是不是没有关系,如果有关系那么肯定是一对一关系
create table user( id int primary key auto_increment, name varchar(32) detail_id int unique, foreign key(detail_id) references userDetail(id) on update cascade on delete cascade ); create table userDetail( id int primary key auto_increment, phone bigint );○ 创建一对一的表关系时建议建在查询频率较高的表中便于后续查询