# 语法:
create table 表名 (
字段名1 数据类型 约束条件1 约束条件2 约束条件3,
字段名2 数据类型 约束条件1 约束条件2 约束条件3,
字段名3 数据类型 约束条件1 约束条件2
);
注意事项:
为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,数据库管理系统自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据准确有效。
约束条件 | 解释 |
---|---|
NOT NULL | 非空约束,指定某列不能为空; |
UNIQUE | 唯一约束,指定某列或者几列组合不能重复 |
PRIMARY KEY | 主键,指定该列的值可以唯一地标识该列记录 |
FOREIGN KEY | 外键,指定该行记录从属于主表中的一条记录,主要用于参照完整性 |
非空约束,指定某列不能为空。
create table t1 (id int, name varchar(16) not null);
# 说明在录入数据的时候name字段不能为空
常用在数字类型的字段,对其表示范围做出限定,只包含正数,没有负号。
create table t1 (id int(8) unsigned);
# unsigned 表示int表示的范围为大于等于0的,而不包含负数
当输入的内容长度不能达到指定长度时,用0填充。
create table t2 (id int zerofill);
insert into t2 values (1);
insert into t2 values (111111);
create table t3 (id int);
insert into t3 values (1);
insert into t3 values (111111);
可以为指定字段设置默认值,在录入数据的时候,可以不输入该字段内容,为以默认值填充。
create table t4 (id int,
gender enum('male','female') default 'male'
);
# 设置gender的默认值为male
唯一约束,表示指定某列或者几列组合不能重复。
create table t5 (id int, ip varchar(16));
# 单列唯一:ip字段唯一,不能重复
create table t6 (id int, ip varchar(16) unique);
# 多列唯一:ip+port组合不能重复
create table t7 (id int,
ip varchar(16),
port int,
unique(ip, port)
);
主键,指定该列的值可以唯一地标识该列记录,在数据控制上面,主键就相当于非空且唯一,相当于not null + unique。
# id int primary key === id int not null unique
# 主动指定主键字段
create table t8 (id int primary key,
name varchar(16)
);
补充:InnoDB存储引擎要求每一张表必须有一个主键,但是我们在使用的InnoDB存储引擎也没有指定主键,但是表也创建成功了,为什么?
答:是因为InnoDB引擎有一个默认的主键,而这个默认的主键只是帮助我们把表创建成功,并且是隐藏的主键,不能够使用用。主键最主要的一个作用是可以帮助我们提高查询速度。
约束字段为自动增长,被约束的字段必须同时被key约束,搭配primary key使用。
create table t9 (
id int primary key auto_increment,
name varchar(16)
);
delete from 表名
delete from t1;
truncate 表名
truncate t1;
补充:两种方式的区别:
delete from 表名
方式,不会影响主键,当下次添加数据的时候还是在之前的上面递增,而truncate 表名
方式则会影响主键,再次添加数据的时候主键字段会重新开始。
外键的目的是建立两张表之间关系的中间桥梁。
假如我们要描述所有公司的员工,需要描述的属性有这些 : 工号、姓名、部门,公司有3个部门,但是有1个亿的员工,那意味着部门这个字段需要重复存储,部门名字越长,浪费的存储空间就越多。
解决方法: 我们可以定义一个部门表,然后让员工信息表关联该表,如何关联,即使用foreign key,也就是外键。
分析步骤:
判断是否为一对多?
如果只有步骤1成立,则是左表多对一右表
如果只有步骤2成立,则是右表多对一左表
这种情况外键字段一般设置在多的一方
判断是否为多对多?
如果步骤1和2同时成立,则证明这两张表时一个双向的多对一,即多对多
此情况则需要定义一个这两张表的关系表来专门存放二者的关系,也就是第三章表。
判断是否为一对一?
如果1和2都不成立,而是左表的一条记录唯一对应右表的一条记录,反之亦然。
这种情况很简单,就是在左表foreign key右表的基础上,将左表的外键字段设置成unique即可
针对一对一关系,外键字段健在任何一方都可以,推荐在使用频率比较高的一张表上
"""
规则:
1.在创建表关系的时候,先创建基础字段
2.再创建外键关系
3.先创建没有外键的一张表
4.录入数据的时候先录入没有外键的一张表
"""
####################################一对多##########################################
1. 一对多的关系
create table book (
id int primary key auto_increment,
title varchar(64),
price decimal(8, 2),
publish_id int,
Foreign key(publish_id) references publish(id)
);
create table publish (
id int primary key auto_increment,
name varchar(32)
)
####################################多对多##########################################
create table book (
id int primary key auto_increment,
title varchar(64),
price decimal(8, 2)
);
create table author (
id int primary key auto_increment,
name varchar(32)
);
create table book2author (
id int primary key auto_increment,
book_id int,
Foreign key(book_id) references author(id)
on update cascade
on delete cascade,
author_id int,
Foreign key(author_id) references book(id)
on update cascade
on delete cascade
);
###############################一对一######################################
create table author2 (
id int primary key auto_increment,
name varchar(64),
author_detail_id int unique,
Foreign key(author_detail_id) references author_detail(id)
);
create table author_detail (
id int primary key auto_increment,
name varchar(32)
)
当我们将两张表之间建立关联的时候,如果修改了其中一张表的内容,那么另外一张表的关联字段应该不应该随之改变呢?答案是肯定的。因此我们就出现了级联删除、级联更新来解决这样的问题。
on update cascade
:级联更新on delete cascade
:级联删除示例:
create table book (
id int primary key auto_increment,
title varchar(64),
price decimal(8, 2),
publish_id int,
Foreign key(publish_id) references publish(id)
on update cascade
on delete cascade
);
create table publish (
id int primary key auto_increment,
name varchar(32)
)