举例表结构
字段名称 | 字段类型 | 是否NULL | 键值 | 默认值 | 附加信息 |
---|---|---|---|---|---|
Field | Type | Null | Key | Default | Extra |
id | int | No | UNI(唯一键) | Null | auto_increment |
name | verchar(10) | No | PRI(主键) | Null | |
gender | enum | No | man | ||
age | tinyint | Yes | Null | ||
telphone | int | Yes | Null | ||
home_id | int | yes | MUL(外键) | Null |
目录
1. 空属性
-
两个值:null(默认的)和 not null(不为空)
- Null:是一种特殊的值,表示数据缺失、未知或者未定义。例如,在一个记录客户信息的数据库中,如果还没有获取到客户的电子邮箱地址,那么该“电子邮箱”字段可以设为Null。
- Not Null:是一种约束条件,即必须有一个确定的值。比如在一个订单表中,“订单编号”字段通常被定义为Not Null,因为每个订单都必须有一个唯一的编号来标识。
-
数据关联方面
- Null:在外键关联中,允许外键为Null可以表示一种松散的关联关系或者未关联的状态。例如,在一个用户 - 部门关系表中,用户的“部门ID”外键为Null可以表示该用户还没有分配到具体的部门。
- Not Null:当外键为Not Null时,强制建立了两个实体之间的紧密关联。例如,在一个订单 - 客户关系表中,“客户ID”外键为Not Null,这意味着每个订单都必须关联到一个具体的客户,保证了业务逻辑的完整性
-
创建表时数据库默认字段字段为空(default null),但是实际开发时,尽可能保证字段不为空,因为数据为空无法参与运算。
用法:
mysql > CREATE TABLE 表名称 (
-> 字段1 数据类型 not null
-> );
2. 默认值 Default
- 默认值的生效:数据在插入表数据的时候没有给该字段赋值,且该字段存在默认值,就使用默认值,否则报错。
用法:
mysql> create table 表名称 (
-> name varchar(20) not null,
-> age tinyint unsigned default 0,
-> gender char(2) default '男'
-> );
--注意:not null和defalut一般不需要同时出现,
因为default本身有默认值,不会为空
3. 列描述 commenet
列描述:在构建表结构时用comment
来做描述,类似于注释,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解
用法:
mysql> create table tt12 (
-> name varchar(20) not null comment '姓名',
-> age tinyint unsigned default 0 comment '年龄',
-> sex char(2) default '男' comment '性别'
-> );
4. 主键 primary key
- 一张表中最多只能有一个主键
- 主键所在的列通常是整数类型
- 复合主键
- 一个主键可以是多列
primary key( [字段1], [字段2] )
- 主键约束:
- 唯一性:主键的值在表中必须是唯一的,不能重复。
- 非空性:主键列的值为
NOT NULL
。这是因为 NULL 表示缺失或未知的数据,而主键需要明确地标识每一行,不能是不确定的。
- 用法:
mysql> create table t2 ( -> name varchar(10) primary key -> ); Query OK, 0 rows affected (0.00 sec) #复合主键用法: mysql> create table t3 ( -> name varchar(10), -> age int, -> constraint pk_constraint_name primary key(name, age) -> ); Query OK, 0 rows affected (0.01 sec)
- 主外键自定义名称
constraint
,用法如上。
5. 唯一键 unique key
一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多。
-
与主键比唯一键允许为NULL,而且可以多个为NULL。
-
用法:
mysql> create table student ( -> id char(10) unique key comment '学号,不能重复,但可以为空', -> name varchar(10) -> ); Query OK, 0 rows affected (0.01 sec)
6. 外键 foreign key (字段名) references 主表(列)
- 主表
- 也称为父表,是在关系型数据库中拥有主键(Primary Key)的表。主键是一个或多个列的组合,其值唯一标识表中的每一行。主表中的数据通常是基础信息,不依赖于其他表的数据而存在。例如,在一个学生管理系统中,有一个 “班级” 表,它包含班级的基本信息,如班级编号(作为主键)、班级名称等,这个 “班级” 表就是主表。
- 从表
- 也称为子表,是包含外键(Foreign Key)的表。外键是一个或多个列,其值引用主表中主键的值,从表中的数据依赖于主表的数据而存在。继续上面的例子,有一个 “学生” 表,其中包含学生的信息,并且有一个 “班级编号” 列,该列引用 “班级” 表中的 “班级编号”,那么 “学生” 表就是从表。
- 主表则必须是有主键约束或unique约束。
- 外键约束
- 存在性约束:当在从表中插入或更新一条记录时,该记录的外键列的值必须是主表中主键列已经存在的值。这是为了保证数据的一致性和关联性。
- 允许 NULL 值:在某些情况下,外键列可以为 NULL。这通常表示一种特殊情况,即从表中的数据与主表中的数据没有关联。例,可能存在一些员工暂时未分配到任何部门,这时在 employees 表中该员工的 department_id 可以为 NULL。但这需要在定义外键时允许 NULL 值
- 用法
#先创建主表 mysql> create table myclass ( -> id int primary key, -> name varchar(30) not null comment'班级名' -> ); #创建从表 mysql> create table stu ( -> id int primary key, -> name varchar(30) not null comment '学生名', -> class_id int, -> foreign key (class_id) references myclass(id) -> );
foreign key (字段名) references 主表(列)
7. 自增长 auto_increment
auto_increment:当插入数据时,若有该属性的字段被忽略,数据库会在上个值的基础上自动+1,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
- AUTO_INCREMENT 列必须被定义为键(通常是主键)。
- 任何一个字段要做自增长,数值必须要有唯一性。
- 自增长字段必须是整数
- 一张表最多只能有一个自增长列