之前已经介绍了字段以及修饰字段的一些属性,根据特定的对象可以将字段进行组合,这就有了表的概念,接下来介绍一下如何操
作数据表结构。对数据表结构的操作有添加表、修改表、删除表、查看表结构。
添加表
格式:create table [if not exist] 表名( 字段名字1 数据类型 ,字段名字1 数据类型 )[表选项];
介绍一下每个部分的意思:
create table | 固定格式,创建表的意思,必填 | ||
if not exist | 表示如果表明不存在,创建,否则不创建,选填 | ||
表名 | 表的名字,必填 | ||
括号中的部分 | 声明的字段,格式为:字段名 数据类型,当有多个字段时,使用逗号隔开,必填 | ||
表选项(选填) | charset | 字符集,声明格式:CHARSET=utf8 | |
engine | 存储引擎,格式:ENGINE=InnoDB | ||
auto_increment | 自增开始值,设置:auto_increment=100 | ||
.......... |
实例,创建一个user表
CREATE TABLE USER (id bigint(20) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键',age int(4) DEFAULT NULL COMMENT '年龄',name varchar(30) NOT NULL UNIQUE COMMENT '名称',money decimal(12,2) DEFAULT NULL COMMENT '存款'
) ENGINE=InnoDB AUTO_INCREMENT=3 CHARSET=utf8;
修改表
对于表的修改,用户可自定义修改表的名称、表选项、表中字段名、字段的类型、添加和删除字段等
实例如下:
# 将表student更名为teacher
rename table 旧名 to 新名;
rename table student to teacher;# 修改表的字符集
alter table teacher charset = gbk;# 增加一个字段
alter table user add user_score double(5,2) not null default 0.00;# 修改一个字段
alter table user modify score varchar(30) default '';# 修改字段名
alter table user change 旧字段名 新字段名 类型;
alter table user change score score_ssss varchar(30);# 删除字段
alter table user drop score_ssss;# 删除字段上的约束
-- 先查看对应的约束有什么
show create table user;
-- 删除对应的索引
alter table user drop index name;# ..........
删除表
# 删除表
drop table [表名1],[表名2],[表名。。。]
drop table user;
注意:此操作一般不要使用,使用也要保证万无一失
查看表结构
# 查看当前数据库下所有表
show tables;# 按着表名关键字查询表
show tables like ‘%关键字’;# 查看表创建语句
show create table user\g;
show create table user\G ;# 查看表中字段信息
desc/describle user;
show columns from user;
在这里说一下表之间的关系,因为表是根据具体的业务需求创建的,所以表之间有各种关系,一般可归为三类
一对一 | 表A中的一条数据和B中一条数据相关,表B中的一条数据和A中一条数据相关 |
一对多 | 表A中的一条数据和B中多条数据相关,表B中的一条数据只与表A中一条数据相关 |
多对多 | 表A中的一条数据和B中多条数据相关,表B中一条数据与表A中多条数据相关 |
在mysql中有外键这一概念,使用外键可以保持表之间的各种关系,但是在实际开发中,一般不使用外键,因为使用外键之后,开发人员对数据的可控性会降低,数据的操作更多的依赖于外键,更有甚者导致系统崩溃,所以实际开发中一般使用事务来保持关联表中数据的一致性,所以这里只是简单的介绍一下外键的使用,而不详细介绍
外键
A表中一个字段(非主键)指向B表的主键,那么这个字段称为外键,A表叫做B表的子表,B表叫做A表的父表。外键要求本身必须是一个索引(普通索引),如果字段本身没有索引,声明外键时数据库会先创建一个索引,然后才会创建外键本身,一张表中可以有多个外键,但是名字不可相同
外键的新增和删除
# 创建表时就给字段添加外键
create table card (id bigint(20) primary key auto_increment not null, uid bigint(20) not null ,card_number varchar(255) not null,-- 添加外键,外键名为f_uid,外键是uid字段,连接user表的id字段constraint f_uid foreign key(uid) references user(id) );# 创建表之后再添加外键
-- 先创建card表
create table card (id bigint(20) primary key auto_increment not null, uid bigint(20) not null ,card_number varchar(255) not null
);-- 将uid作为外键
alter table card add constraint f_uid foreign key(uid) references user(id);# 外键不可以修改,所以需要先删除,后修改
# 删除外键 f_uid,分两步:删外键 ---> 删索引(因为创建外键时,系统自动创建了索引)
alter table card drop foreign key f_uid;
alter table card drop index f_uid;
外键的作用就是用来约束具有联系的表之间的数据,保证数据一致性,其约束模式有四种,如下:
no action | 默认模式 |
restrict | 严格模式,父表不能删除或更新一个已经被子表数据应用的记录,一般不使用 |
cascade | 级联模式,父表的操作,子表关联数据跟着操作,例如:主表数据修改,子表对应数据也级联修改,一般修改操作使用 |
set null | 置空模式,父表操作之后,子表对应的数据(外键字段)被置空,一般删除操作使用 |
下边写一个实例,来介绍一下约束模式的使用,在声明主键时,在后边加上对应的操作和对应的约束模式即可,如下:
# 创建外键fk_uid 并且设置约束模式,修改时是cascade,删除时是set null
alter table card add constraint fk_uid
foreign key(uid) references user(id) on delete set null on update cascade;
使用过程中,注意几个地方:
1、当设置约束模式时,外键字段不要设置为空约束
2、外键名不能重复
3、删除外键时,要注意将创建外键时系统创建的索引也删除,一般和外键名同名
4、必须保证表的存储引擎是Innodb,如果不是,外键可以创建成功,但是没有约束作用
5、外键字段类型必须与父表的主键类型一致