数据类型介绍

MySQL 数据类型分类

  • 整型
  • 浮点型
  • 字符类型(char与varchar)
  • 日期类型
  • 枚举与集合

具体数据类型见这篇博客

MySQL表操作中的约束

  • primary key 主键约束 非空+唯一
  • unique key 唯一约束
  • not null 非空约束
  • foreign key 外键约束

创建表的的语法

CREATE TABLE[IF NOT EXISTS] tbl_name(字段名称字段类型[完整性约束条件])ENGINE=引擎名称 CHARSET='编码方式”

⚠️注意:

  1. 在同一张表中,字段名不能相同
  2. 宽度和约束条件可选,字段名和类型是必须的
  3. 最后一个字段后不能加逗号!

整型

  • 分类:TINYINT SMALLINT MEDIUMINT INT BIGINT
  • 作用:存储年龄,等级,id,各种号码等
create table t1(id tinyint); # 创建 tinyint类型 tinyint 范围-128-128
create table t2(x tinyint unsigned); # 创建无符号整数

强调

对于整型来说,数据类型后的宽度并不是存储限制,而是显示限制,所以在创建表时,如果字段采用的是整型类型,完全无需指定显示宽度, 默认的显示宽度,足够显示完整当初存放的数据

浮点型

  • 分类:FLOAT DOUBLE decimal
  • 应用场景:身高,体重,薪资

字段限制特点(5,3)前一位表示所有的位数,后一位表示小数个数

字符类型

  • 分类 char(定长) varchar(变长)
  • 作用:姓名,地址,描述类信息
create table t10(name char(4))  # 超出四个字符报错,不够四个字符空格补全
create table t11(name varchar(4)) # 超出四个字符报错,不够四个有几个就存几个

时间类型

  • 分类

    • date:2019-05-01

    • time:11:11:11

    • Datetime: 2019-01-02 11:11:11

    • Year:2019

create table student(
id int,
name char(16),
born_year year,
birth date,
study_time time,
reg_time datetime
);

枚举与集合类型

  • 分类

    • 枚举enum 多选一
    • 集合set 多选多

枚举

create table user(
id int,
name char(16),
gender enum('male','female','others')
);

插入下面数据时第一句就会报错因为XXX不在创建的枚举类型中

insert into user values(1,'小明','xxx')  # 报错
insert into user values(2,'二明','female') # 正确!

集合

create table teacher(
id int,
name char(16),
gender enum('male','female','others'),
hobby set('read','sleep','run','singing')
);

插入的时候只要是插入的数据在集合中就可以,值可以没有(MySQL80),可以是一个,也可以全都是。

insert into teacher values(1,'小明','male','read,sleep')

约束条件

  • PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录
  • FOREIGN KEY (FK) 标识该字段为该表的外键
  • NOT NULL 标识该字段不能为空
  • UNIQUE KEY (UK) 标识该字段的值是唯一的
  • AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)
  • DEFAULT 为该字段设置默认值
  • UNSIGNED 无符号
  • ZEROFILL 使用0填充

not null+default

有时候插入数据的时候,要限制不为空,但是这个时候没有插入值,我们可以设置默认值,让默认值去填充没有插入的数据

create table student2(
id int,
name char(16) not null,
gender enum('male','female','others') default 'male'
);

当设置字段的默认值的时候,不写数据也不会出错

insert into student2(id,name) values(1,'小明')
mysql> select * from student2;
+------+--------+--------+
| id | name | gender |
+------+--------+--------+
| 1 | 小明 | male |
+------+--------+--------+

unique

单列唯一


create table user1(
id int unique,
name char(16)
);
insert into user1 values(1,'小明'),(1,'小蓝')  # 报错
insert into user1 values(1,'小明'),(2,'小蓝') # 成功

联合唯一

将多个字段设置为唯一,只有当多个字段的值出现重复时才会出现错误。

create table server(
id int,
ip char(16),
port int,
unique(ip,port)
)
insert into server values(1,'127.0.0.1',8080); # 成功
insert into server values(2,'127.0.0.1',8080); # 报错
insert into server values(1,'127.0.0.1',8081); # 报错

primary key+auto_increment

单从约束角度来说primary key就等价于not null unique,指定not null 和unique两个字段的时候也会将字段设置为主键。

除了约束之外,它还是innodb引擎组织数据的依据,提升查询效率。

一张表中必须有且只有一个主键,如果你没有设置主键,那么会从上到下搜索直到遇到一个非空且唯一的字段自动将其设置为主键。

如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏字段作为主键,隐藏意味着你在查询的时候无法根据这个主键字段加速查询了

索引:类似于书的目录,没有主键就相当于一页一页翻着查

一张表中通常都应该有一个id字段,并且通常将改id字段作成主键

主键

create table t12(
id int primary key,
name char(16),
age int not null unique,
addr char(16) not null unique
)engine=innodb;
desc t12; -- 将ID字段设置为主键
mysql> desc t12;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | char(16) | YES | | NULL | |
| age | int(11) | NO | UNI | NULL | |
| addr | char(16) | NO | UNI | NULL | |
+-------+----------+------+-----+---------+-------+

联合主键

多个字段联合起来作为表的一个主键,本质还是一个主键

create table t18(
ip char(16),
port int,
primary key(ip,port)
); mysql> desc t18;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| ip | char(16) | NO | PRI | NULL | |
| port | int(11) | NO | PRI | NULL | |
+-------+----------+------+-----+---------+-------+

MySQL 数据类型简介 创建数据表及其字段约束的更多相关文章

  1. django学习-10.django连接mysql数据库和创建数据表

    1.django模型 Django对各种数据库提供了很好的支持,包括:PostgreSQL.MySQL.SQLite.Oracle. Django为这些数据库提供了统一的调用API. 我们可以根据自己 ...

  2. python学习之老男孩python全栈第九期_数据库day001知识点总结 —— MySQL操作数据库以及数据表、基本数据类型、基本增删改查、外键定义以及创建

    一. 学习SQL语句规则以及外键 1. 操作文件夹 create database db2; 创建文件夹 create database db2 default charset utf8; 创建文件夹 ...

  3. MySQL创建数据表并建立主外键关系

    为mysql数据表建立主外键需要注意以下几点: 需要建立主外键关系的两个表的存储引擎必须是InnoDB. 外键列和参照列必须具有相似的数据类型,即可以隐式转换的数据类型. 外键列和参照列必须创建索引, ...

  4. MySQL在创建数据表的时候创建索引

    转载:http://www.baike369.com/content/?id=5478 MySQL在创建数据表的时候创建索引 在MySQL中创建表的时候,可以直接创建索引.基本的语法格式如下: CRE ...

  5. PHP全栈开发(七):PHP与MySQL存储交互(1.连接、创建数据库;创建数据表)

    在Linux服务器中可以使用命令 mysqladmin -u root password beijing2007; 来修改MySQL的root用户的密码. 但是在我们自己安装了wampserver的电 ...

  6. MySQL学习笔记_2_MySQL创建数据表(上)

    MySQL创建数据表(上) 一.创建数据表的SQL语句模型[弱类型] CREATETABLE [IF NOT EXISTS] 表名称( 字段名1列的类型[属性][索引], 字段名2 列的类型[属性][ ...

  7. MySQL创建数据表

    *  创建数据表 * *       *      一.什么是数据表 * *           * *      二.创建数据表的SQL语句模型 * *          DDL * *       ...

  8. MySQL 创建数据表

    MySQL 创建数据表 创建MySQL数据表需要以下信息: 表名 表字段名 定义每个表字段 语法 以下为创建MySQL数据表的SQL通用语法: CREATE TABLE table_name (col ...

  9. MySQL学习笔记_4_MySQL创建数据表(下)

    MySQL创建数据表(下) 五.数据表类型及存储位置 1.MySQL与大多数数据库不同,MySQL有一个存储引擎概念.MySQL可以针对不同的存储需求选择不同的存储引擎. 2. showengines ...

随机推荐

  1. Kettle实现从mysql中取2张表数据关联的数据,并写入到mongodb中

    1 建立转换,并设置DB连接到mysql 选中DB连接:连接类型选择MySQL,输入主机名称,数据库名称,端口号,用户名,密码 输入连接名称,点击确定.(可以先点击测试,测试一下是否连接成功) 如下图 ...

  2. Hadoop、Hbase —— 服务启动、验证、停止

    一.Hadoop  1.启动Hadoop cd /usr/local/hadoop-2.7.3/sbin ./start-dfs.sh 启动过程如下: 2.验证Hadoop是否启动成功 2.1.在主节 ...

  3. php支持多个地址跨域访问

    //跨域访问的时候才会存在此字段 $origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : ''; $allow_ori ...

  4. 纹理特征描述之自相关函数法 纹理粗糙性与自相关函数的扩展成正比 matlab代码实现

    图像中通常采用自相关函数作为纹理测度 自相关函数的定义为: ​ 调用自定义函数 zxcor()对砖墙面和大理石面纹理进行分析: 自定义函数 zxcor(): function [epsilon,eta ...

  5. Spark Streaming的实时词频和累加词频统计

    (注:运行环境是Ubuntu16, pycharm) 1. 按时段统计:获取scoket端口传输的数据(英文数据即可,方便分词),统计各个时间段内每个单词出现的次数(每个时间段都分别统计,需要使用的关 ...

  6. Big Box

    #include <stdio.h> #define N 500 int height[N]; int n; int main() { scanf("%d", & ...

  7. 论文阅读 | A Survey on Multi-Task Learning

    摘要 多任务学习(Multi-Task Learning, MTL)是机器学习中的一种学习范式,其目的是利用包含在多个相关任务中的有用信息来帮助提高所有任务的泛化性能. 首先,我们将不同的MTL算法分 ...

  8. Oracle-DQL 4- 多表查询

    多表查询: 1.笛卡尔积SELECT * FROM dept;--查询员工的信息和其所在部门的信息SELECT ename,job,dname,locFROM emp,dept; --集合A中的所有元 ...

  9. JSP与Servlet之间的交互,传值

    一.Servlet 首先要明白一点,servlet需要容器的支持才能够运行,如Tomcat.jetty 达到servlet的请求,需要ServletRequest对象和ServletResponse对 ...

  10. Symfony4框架中单元测试和接口测试中的一些小坑

    前提说明: symfony 版本 4.1.*,使用  composer create-project symfony/website-skeleton  进行安装. 目标:在一个单元测试用例中对当前工 ...