主键 primary key
1.从约束条件的层面上来说 相当于 not null unique>>>>>非空且唯一
create table t1(id int primary key); creare table t2(id int not null unique);
2.但是主键还是InnoDB储存引擎组织数据表的依据
InNoDB规定了一个表必须有且只有一个主键
不指定主键的情况下会采用隐藏的字段作为主键
当表中没有主键但是有非空且唯一的字段就自动的升级为主键(从上往下的第一个)
主键可以加快查询的速度 隐藏意味着无法使用主键就会导致速度无法提升
create table t2( id int, name char(16), age int not null unique, addr char(16) not null unique);
结论:在创建表的时候一般都需要id字段 并且该字段一个设置为标的主键字段
主键可以是单列主键也可以是多列主键 但是联合主键使用的频率很低
create table t3( id int, name char(16), primary key(id,name));
自增 auto_increment
配合主键一起使用
create table t4( id int primary key, name char(16));
主键字段的固定写法:
id int primary key auto_increment
1.自增的特性不会因为delete操作而重置或回退
delete from 只删除数据
2.如果想重置需要清空表数据和表结构
truncate 即删除数据又重置主键
怎么引出外键这个知识点
举个员工表的例子:
先定义一张员工表
id name age dep_name dep_desc
问题出现了:
1.表结构不清晰
2.表数据重复
3.数据扩展性差
如何解决上面的三个问题:对表格进行拆分
虽然通过拆表解决了上面的三个问题但是员工跟部门却没有了关系
在员工表里面添加一个部门的编号dep_id(外键)
外键的定义:记录表与表之间数据关系的字段
一对多关系
多对多关系
一对一关系
没有关系
一对多关系
判断表的关系需要我们遵循 换位思考 的原则
例子: 员工表与部门表
1.先占在员工表的层面
问题:一个员工是否能够存在于多个部门
回答:不行
2.再在部门表的层面
问题:一个部门可以有多个员工吗
回答:可以
结论:一个可以 一个不可以 那么员工表和部门表的关系就是"一对多"
对应的SQL语句怎么写
1.先写基本字段类型与约束条件
2.之后在考虑外键
create table emp( id int primary key auto_increment, name char(16), age int, dep_id int, foreign key(dep_id) references dep(id) ); create table dep( id int primary key auto_increment, dep_name char(16), dep_desc char(32) );
例子: 以书籍表与作者表
1.先站在书籍表
问:一本书可以有多个作者嘛
答:可以
2.站在作者表
问:一名作者可不可以有多个书
答:可以
结论:两边都可以 表关系就是"多对多"
针对多对多的表关系 外键字段需要建立在第三张表格中
SQL语句写法
create table book( id int primary key auto_increment, name char(16)); create table author( id int primary key auto_increment, name char(16), age int);
create table book2author(
id int primary key auto_increment,
author_id int,
book_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade,
foreign key(book_id) references book(id)
on update cascade
on delete cascade
);
可以借鉴的例子就是
客户表与学生表
用户名与用户详情表
下面是客户表与可以纤细信息表
结论:两边都不可以 那么表关系不是"一对一"的关系就是没有关系
一对一表关系:外键建立在任何的一个表中都可以 但是推荐建立在查询频率比较高的表中
SQL语句写法
create table user( id int primary key auto_increment, name varchar(16), detail_id int unique, foreign key(detail_id) references user_detail(id) on update cascade on delete cascade ); create table user_detail( id int primary key auto_increment, phone bigint, addr varchar(16) );
1.修改表名
alter table 表名 rename 新表名;
2.增加字段
alter table 表名 add 字段名 数据类型 [完整性约束条件],
add 字段名 数据类型 [完整性约束条件…];
alter table 表名
add 字段名 数据类型 [完整性约束条件…] first;
alter table 表名
add 字段名 数据类型 [完整性约束条件…]after 字段名;
3.删除字段
alter table 表名 drop 字段名;
3.修改字段(modify只能修改字段数据类型完整约束,不能修改字段名,但是change可以哦!!!!)
alter table 表名 change 旧字段名 新字段名 旧数据类型 [完整约束条件...];
alter table 表名 change 旧字段名 新字段名 新数据类型 [完整约束条件...];