数据类型从数据存储底层机制来看,主要和内存中如何存储数据信息有关;
在数据库服务中,每一个常量、变量和参数都有数据类型,数据类型用来指定数据的存储格式、约束和有效范围
数据类型
参考链接:https://m.php.cn/article/460317.html
数字类型
整形
| 类型 | 含义 | 范围或用法 |
|---|
| tingint | 1 | 无符号0255,有符号-128127 |
| smallint(m) | 2 | 无符号[0,65535],有符号[-32768,32767] |
| mediumint(m) | 3 | 无符号[0,2^24-1],有符号[-2^23,2^23-1]] |
| int | 4 | 无符号0 ~ 4294967295,有符号-2147483648 ~ 2147483647(最大10位数) |
| bigint(m) | 8 | 无符号[0,2^64-1],有符号[-2^63 ,2^63 -1] |
浮点
| 类型 | 含义 | 范围或用法 |
|---|
| float(M,D) | 4 | 8位精度(4字节) m总个数,d小数位 |
| double(m,d) | 8 | 16位精度(8字节) m总个数,d小数位 |
| decimal | M+1或M+2 | |
字符串类型
字符
| 类型 | 字节 | 范围或用法 |
|---|
| char(M) | M | 定长字符串。M表示可以存储字符的字节上限(M取值 0~255) |
| varchar(M) | M | 变长字符串。M表示可以存储字符的字节上限(M取值 0~65535) |
| enum | 1或2 | 最大可达65535个不同的枚举值 |
| set | 可达8 | 最大可达64个不同的值 |
| text | Max:64K | 大小写不敏感 |
时间类型
| 类型 | 字节长度 | 范围或用法 |
|---|
| date | 3 | 以YYYY-MM-DD的格式显示,比如:2009-07-19 |
| time | 3 | 以HH:MM:SS的格式显示。比如:11:22:30 |
| datetime | 8 | 以YYYY-MM-DD HH:MM:SS的格式显示,比如:2009-07-19 11:22:30 |
| timestamp | 4 | 以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)