数据类型从数据存储底层机制来看,主要和内存中如何存储数据信息有关;

在数据库服务中,每一个常量、变量和参数都有数据类型,数据类型用来指定数据的存储格式、约束和有效范围

数据类型

参考链接:https://m.php.cn/article/460317.html

数字类型

整形

类型含义范围或用法
tingint1无符号0255,有符号-128127
smallint(m)2无符号[0,65535],有符号[-32768,32767]
mediumint(m)3无符号[0,2^24-1],有符号[-2^23,2^23-1]]
int4无符号0 ~ 4294967295,有符号-2147483648 ~ 2147483647(最大10位数)
bigint(m)8无符号[0,2^64-1],有符号[-2^63 ,2^63 -1]

浮点

类型含义范围或用法
float(M,D)48位精度(4字节) m总个数,d小数位
double(m,d)816位精度(8字节) m总个数,d小数位
decimalM+1或M+2

字符串类型

字符

类型字节范围或用法
char(M)M定长字符串。M表示可以存储字符的字节上限(M取值 0~255)
varchar(M)M变长字符串。M表示可以存储字符的字节上限(M取值 0~65535)
enum1或2最大可达65535个不同的枚举值
set可达8最大可达64个不同的值
textMax:64K大小写不敏感

时间类型

类型字节长度范围或用法
date3以YYYY-MM-DD的格式显示,比如:2009-07-19
time3以HH:MM:SS的格式显示。比如:11:22:30
datetime8以YYYY-MM-DD HH:MM:SS的格式显示,比如:2009-07-19 11:22:30
timestamp4以YYYY-MM-DD的格式显示,比如:2009-07-19

属性约束(约束用户输入的信息)

约束

属性约束含义
PK(primary key)表示主键约束,非空且唯一(表中只能有一个主键)
UK(unique key)表示唯一约束
NN(not null)表示非空约束
FK(foreign key)表示外键约束,多表之间关联使用 约束能力

属性

含义
设定默认数据信息,可以实现自动填充default
设定数据信息自增,可以实现数值编号自增填充(一般配合主键使用)auto_increment
设定数据注释信息comment
设定数值信息非负,可以实现数值信息列不能出现负数信息unsigned

外键设置

添加外键

方式一:在创建表的时候就增加外键,表字段之后使用foreign key

# 创建外键语法格式
foreign key(外键字段) references主表(主键)

# 创建外键关联的父表
mysql> create table class(
    -> id int primary key auto_increment,
    -> name varchar(10) not null comment "班级名字,不能为空",
    -> room varchar(10) comment "教师,允许为空"
    -> ) charset utf8;
    
mysql> show create table class;
+-------+-------------------------------------------------------------------------------+
| Table | Create Table                                                                  |
+-------+-------------------------------------------------------------------------------+
| class | CREATE TABLE `class` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(10) NOT NULL COMMENT '班级名字,不能为空',
  `room` varchar(10) DEFAULT NULL COMMENT '教师,允许为空',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3                                                 |
+-------+-------------------------------------------------------------------------------+
1 row in set (0.04 sec)

mysql> desc class;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int         | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | NO   |     | NULL    |                |
| room  | varchar(10) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

# 创建子表使用的外键,c_id是外键字段,class是引用表(父表),id是引用字段(主键)
mysql> create table student(
    -> id int primary key auto_increment,
    -> number char(10) not null unique comment "学号,不能重复",
    -> name varchar(10) not null comment "姓名",
    -> c_id int,
    -> foreign key(c_id) references class(id)   
    -> ) charset utf8;

mysql> show create table student;
+---------+-----------------------------------------------------------------------------+
| Table   | Create Table                                                                |
+---------+--- -------------------------------------------------------------------------+
| student | CREATE TABLE `student` (
  `id` int NOT NULL AUTO_INCREMENT,
  `number` char(10) NOT NULL COMMENT '学号,不能重复',
  `name` varchar(10) NOT NULL COMMENT '姓名',
  `c_id` int DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `number` (`number`),
  KEY `c_id` (`c_id`),
  CONSTRAINT `student_ibfk_1` FOREIGN KEY (`c_id`) REFERENCES `class` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3          |
+---------+-----------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> desc student;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int         | NO   | PRI | NULL    | auto_increment |
| number | char(10)    | NO   | UNI | NULL    |                |
| name   | varchar(10) | NO   |     | NULL    |                |
| c_id   | int         | YES  | MUL | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

方式二:在创建表之后增加外键,指定外键名字

# 创建外键语法格式
alter table 表名 add constraint 外键名 foreign key(外键字段) references 父表(主键字段)

# 创建没有外键的表
mysql> create table t_foreign(
    -> id int primary key auto_increment,
    -> c_id int
    -> ) charset utf8;
Query OK, 0 rows affected, 1 warning (0.04 sec)

mysql> show create table t_foreign;
+-----------+---------------------------------------------------------------------------+
| Table     | Create Table                                                              |
+-----------+---------------------------------------------------------------------------+
| t_foreign | CREATE TABLE `t_foreign` (
  `id` int NOT NULL AUTO_INCREMENT,
  `c_id` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 |
+-----------+---------------------------------------------------------------------------+
1 row in set (0.01 sec)

mysql> desc t_foreign;
+-------+------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra          |
+-------+------+------+-----+---------+----------------+
| id    | int  | NO   | PRI | NULL    | auto_increment |
| c_id  | int  | YES  |     | NULL    |                |
+-------+------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

# 在没有外键的表中添加外键
mysql> alter table t_foreign add constraint class_foreign foreign key(c_id) references class(id);
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table t_foreign;
+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table     | Create Table                                                                                                                                                                                                                                                        |
+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_foreign | CREATE TABLE `t_foreign` (
  `id` int NOT NULL AUTO_INCREMENT,
  `c_id` int DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `class_foreign` (`c_id`),
  CONSTRAINT `class_foreign` FOREIGN KEY (`c_id`) REFERENCES `class` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 |
+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> desc t_foreign;
+-------+------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra          |
+-------+------+------+-----+---------+----------------+
| id    | int  | NO   | PRI | NULL    | auto_increment |
| c_id  | int  | YES  | MUL | NULL    |                |
+-------+------+------+-----+---------+----------------+
2 rows in set (0.00 sec)