mysql数据库 --数据类型、约束条件
今日内容
表的详细使用
1、创建表的完成语法
2.字段类型
整型、浮点型、字符类型、日期类型、枚举与集合类型
3.约束条件
primary key、unique、not null、default
一、创建表的完成语法
1.语法
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
PS:注意事项:
1. 在同一张表中,字段名不能相同
2. 宽度和约束条件可选,字段名和类型是必须的
3. 最后一个字段后不能加逗号!
2.补充
(1)宽度指的是对存储数据的限制
create table userinfo(name char);
insert into userinfo values('lisi');
1.没有安全模式的数据库版本,能够存放数据但是只会存进去一个j
2.最新数据库版本直接报错提示无法存储(我装的是5.7 直接出现下面的结果):
mysql> insert into userinfo values('lisi');
ERROR 1406 (22001): Data too long for column 'name' at row 1
(2) 约束条件初识>>> null 与 nut null
create table t1(id int,name char not null);
insert into t1 values(1,'j'); # 正常存储
insert into t1 values(2,null); # 报错
# 总结 类型与约束条件区别
# 类型:限制字段必须以什么样的数据类型存储
# 约束条件:约束条件是在类型之外添加一种额外的限制
二、字段类型
2.1 整型
create table t1(x tinyint);
insert into t1 values(128),(-129);
输出结果:
mysql> insert into t1 values(-1),(-129);
ERROR 1264 (22003): Out of range value for column 'x' at row 2
create table t2(x tinyint unsigned);
insert into t2 values(-1),(256);
输出结果:
mysql> insert into t2 values(-1),(256);
ERROR 1264 (22003): Out of range value for column 'x' at row 1
create table t3(x int unsigned);
insert into t3 values(4294967296);
输出结果:
mysql> insert into t3 values (4283942745);
Query OK, 1 row affected (0.07 sec)
说明:由于开启了严格模式,导致t1,t2表插入数据失败
在不开启严格模式下,可以顺利的写数据,但是:
(1)tinyint:默认情况下是有符号的
有符号:-128 ~ 127
无符号:0 ~ 255
(2)unsigned:表示无符号
2020.06.01更新
关于**严格模式**看这个介绍:https://www.cnblogs.com/ygcphp/p/10417260.html
2.1.2 两点补充
(1)Q:类型后面的宽度能否改变字段存储的大小限制?
A:对于整型来说,数据类型后的宽度并不是存储限制,而是显示限制,所以在创建表时,
如果字段内采用的是整型类型,完全无需指定显示宽度,默认的是显示宽度,足够
完整的显示当初存放的数据。
create table t4(x int(8));
insert into t4 values(1232983640223);
# 显示时,不够8位用0填充,如果超出8位则正常显示
create table t5(x int(8) unsigned zerofill);
insert into t5 values(1232983640223);
# create table t6(id int(10) unsigned);
# create table t7(id int(11));
(2) 严格模式补充
在上面设置了char,tinyint,存储数据时超过它们的最大存储长度,
发现数据也能正常存储进去,只是mysql帮我们自动截取了最大长度。
但在实际情况下,我们应该尽量减少数据库的操作,缓解数据库的压力,
让它仅仅只管理数据即可,这样的情况下就需要设置安全模式
how variables like "%mode%"; # 查看数据库配置中变量名包含mode的配置参数
# 修改安全模式
set session # 只在当前操作界面有效
set global # 全局有效
set global sql_mode ='STRICT_TRANS_TABLES'
# 修改完之后退出当前客户端重新登陆即可
2.2 浮点型
分类:FLOAT DOUBLE decimal
应用场景:身高、体重、利率
字段限制特点: (5,3)前一位表示所有的位数,后一位表示小数个数
三者最大整数位和小数位对比: ----> 单写一个测试博客
# 存储限制
float(255,30) # 表示一共位数为255位,小数位为30位
double(255,30) # 表示一共位数为255位,小数位为30位
decimal(255,30) # 表示一共位数为65位,小数位为30位
# 精确度验证
create table t5(x float(255,30));
create table t6(x double(255,30));
create table t7(x decimal(65,30));
三者区别:
精度不同:
精度由低到高:float --> double --> decimal
代码输出结果:
(1) float
mysql> create table t5 (x float(255, 30));
Query OK, 0 rows affected (0.54 sec)
mysql> insert into t5 values(1.111111111111111111111111111111);
Query OK, 1 row affected (0.08 sec)
mysql> select * from t5;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
1 row in set (0.00 sec)
(2) double
mysql> create table t6 (x double(255, 30));
Query OK, 0 rows affected (0.32 sec)
mysql> insert into t6 values(1.111111111111111111111111111111);
Query OK, 1 row affected (0.06 sec)
mysql> select * from t6;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
1 row in set (0.00 sec)
(3) decimal
mysql> create table t7 (x decimal(65, 30));
Query OK, 0 rows affected (0.30 sec)
mysql> insert into t7 values(1.111111111111111111111111111111);
Query OK, 1 row affected (0.06 sec)
mysql> select * from t7;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111111111111111111111111111 |
+----------------------------------+
1 row in set (0.06 sec)
2.3 字符类型
(1)分类:
char:定长
varchar:变长
(2)作用:姓名、地址、描述类信息
create table t8 (name char(4)); # 超过四个字符报错,不够四个字符空格补全
create table t9 (name varchar(4)); # 超过四个字符报错,不够四个有几个就存几个
# 验证存储限制
insert into t8 values('hello');
insert into t9 values('hello');
# 验证存储长度
insert into t8 values('a'); #'a '
insert into t9 values('a'); #'a'
select * from t8
select * from t9 # 无法查看真正的结果
select char_length(name) from t8;
select char_length(name) from t9; # 仍然无法查看到真正的结果
mysql> select char_length(name) from t8;
+-------------------+
| char_length(name) |
+-------------------+
| 1 |
+-------------------+
1 row in set (0.37 sec)
mysql> select char_length(name) from t9;
+-------------------+
| char_length(name) |
+-------------------+
| 1 |
+-------------------+
1 row in set (0.00 sec)
(3) char 和 varchar 的优缺点:
char:
缺点:浪费空间
优点:存取速度都快
varchar:
缺点:存储速度慢
优点:节省时间
2.4 时间类型
(1) 分类
date: 2019-05-01
time: 17:13:32
datetime: 2019-05-01 17:13:32
year:2019
(2) 测试
create table student(
id int,
name char(16),
yy year,
birth date,
study_time time,
reg_time datetime
);
insert into student values(1,'lisi','2019','2019-05-13','17:17:32','2019-05-13 17:17:32');
mysql> select * from student;
+------+------+------+------------+------------+---------------------+
| id | name | yy | birth | study_time | reg_time |
+------+------+------+------------+------------+---------------------+
| 1 | lisi | 2019 | 2019-05-13 | 17:17:32 | 2019-05-13 17:17:32 |
+------+------+------+------------+------------+---------------------+
1 row in set (0.00 sec)
2.5 枚举与集合类型
(1)分类:
枚举enum多选一
集合set多选多(可以多选一)
(2)测试:
(a)枚举enum
create table user(
id int,
name char(16),
gender enum('male','female')
);
insert into user values(1, 'lisi','male'); # 正确
# Query OK, 1 row affected (0.06 sec)
insert into user values(2, 'zhangsan','xxx'); # 报错
# ERROR 1265 (01000): Data truncated for column 'gender' at row 1
(b)集合set
create table teacher(
id int,
name char(16),
hobby set('read','music','sleep','run')
);
insert into teacher values(1, 'zhangsan','music,sleep'); # 正确
# Query OK, 1 row affected (0.06 sec)
insert into teacher values(2, 'lisi','sleep'); # 正确 集合可以只选一个
# Query OK, 1 row affected (0.06 sec)
insert into teacher values(3, 'wangwu','heihei'); # 报错
# ERROR 1265 (01000): Data truncated for column 'hobby' at row 1
三、约束条件
3.1 约束条件
PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录
FOREIGN KEY (FK) 标识该字段为该表的外键
NOT NULL 标识该字段不能为空
UNIQUE KEY (UK) 标识该字段的值是唯一的
AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT 为该字段设置默认值
UNSIGNED 无符号
ZEROFILL 使用0填充
3.2 not null + default
(a)not null:
create table user(
id int,
name char(16)
);
insert into user values(1,null) # 可以修改
# Query OK, 1 row affected (0.10 sec)
alter table user modify name char(16) not null;
# 报错:
ERROR 1138 (22004): Invalid use of NULL value
查了一下,应该是由于表里有数据,所以不可以改
mysql> delete from user;
Query OK, 1 row affected (0.10 sec)
mysql> alter table user modify name char(16) not NULL;
Query OK, 0 rows affected (0.42 sec)
Records: 0 Duplicates: 0 Warnings: 0
insert into user(name,id) values(null,2); # 报错 插入数据可以在表名后面指定插入数据对应的字段
# ERROR 1048 (23000): Column 'name' cannot be null
(b) default:
create table student(
id int,
name char(16) not null,
gender enum('male','female','others') default 'male'
);
insert into student(id,name) values(1,'zhangsan') # 成功
# Query OK, 1 row affected (0.09 sec)
3.3 unique
(a) 单列唯一:某一项值为独一无二的
create table user1(
id int unique,
name char(16)
);
insert into user1 values(1,'lisi'),(1,'wawu'); # 报错
# ERROR 1062 (23000): Duplicate entry '1' for key 'id'
insert into user1 values(1,'lisi'),(2,'wawu'); # 成功
# Query OK, 2 rows affected (0.06 sec)
# Records: 2 Duplicates: 0 Warnings: 0
(b) 联合唯一:多项值,只要不全相同就ok
create table server(
id int,
ip char(16),
port int,
unique (ip,port)
);
insert into server values(1,'127.0.0.1',8080);
# Query OK, 1 row affected (0.06 sec)
insert into server values(2,'127.0.0.1',8080); # 报错
# ERROR 1062 (23000): Duplicate entry '127.0.0.1-8080' for key 'ip'
insert into server values(1,'127.0.0.1',8081);
# Query OK, 1 row affected (0.06 sec)
3.4 primary key + auto_increment
(a) 单从约束角度来说 primary key <==> not null unique
create table t10 (id int primary key);
desc t10;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
insert into t10 values(1),(1); # 报错
# ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
insert into t10 values(1),(2);
# Query OK, 2 rows affected (0.06 sec)
# Records: 2 Duplicates: 0 Warnings: 0
# 除了约束之外,它还是innodb引擎组织数据的依据,提升查询效率
(b) 强调:
1.一张表中必须有且只有一个主键,如果你没有设置主键,
那么会从上到下搜索直到遇到一个非空且唯一的字段自动将其设置为主键
create table t11(
id int,
name char(16),
age int not null unique,
addr char(16) not null unique
)engine=innodb;
desc t11;
mysql> desc t11;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | char(16) | YES | | NULL | |
| age | int(11) | NO | PRI | NULL | |
| addr | char(16) | NO | UNI | NULL | |
+-------+----------+------+-----+---------+-------+
4 rows in set (0.01 sec)
2.如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏字段作为主键,隐藏意味着你在查询的时候无法根据这个主键字段加速查询了
索引:类似于书的目录,没有主键就相当于一页一页翻着查
3.一张表中通常都应该有一个id字段,并且通常将改id字段作成主键
(c) 联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键
create table t12(
ip char(16),
port int,
primary key(ip, port)
);
desc t12;
mysql> desc t12;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| ip | char(16) | NO | PRI | NULL | |
| port | int(11) | NO | PRI | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.01 sec)
(d) 主键id作为数据的编号,每次最好能自动递增
create table t13(
id int primary key auto_increment,
name char(16)
);
insert into t13 name values ('jason','jason','jason');
Query OK, 3 rows affected (0.36 sec)
Records: 3 Duplicates: 0 Warnings: 0
# id字段自动从1开始递增
# 注意:auto_increment通常都是加在主键上,并且只能给设置为key的字段加
mysql数据库 --数据类型、约束条件的更多相关文章
- MySQL数据库数据类型之集合类型SET测试总结
MySQL数据库提供针对字符串存储的一种特殊数据类型:集合类型SET,这种数据类型可以给予我们更多提高性能.降低存储容量和降低程序代码理解的技巧,前面介绍了首先介绍了四种数据类型的特性总结,其后又分别 ...
- MYSQL数据库数据类型
07.14自我总结 MYSQL数据库数据类型 一.整数类型和浮点数典型 1.有符号/没符号 对于整数和负整数来说,默认情况下是有符号范围的 默认是有符号 有符号和没符号其实就是有没有包括负数,有符号是 ...
- MySql数据库数据类型及约束介绍
1,MySql中数据类型介绍 整型及浮点型 数据类型 存储范围 字节 TINYINT 有符号值:-2^到2^7-1 无符号值:0到2^8-1 2 SMALLINT 有符号值:-2^15到2^15-1 ...
- MySQL数据库数据类型以及INT(M)的含义
nt(M)我们先来拆分,int是代表整型数据那么中间的M应该是代表多少位了,后来查mysql手册也得知了我的理解是正确的,下面我来举例说明. MySQL 数据类型中的 integer types ...
- mysql数据库 数据类型
char(m) 固定长度字符串,m<=255:处理速度快: varchar(m) 可变长度字符串,m<=255: int(m) 整数型,-214783647到214783648之间,使用u ...
- MySQL基本数据类型与约束条件
昨日内容回顾 数据存储的演变 # 方向: 朝着更加统一和方便管理 数据库的发展史 # 由本地保存逐步演变为线上保存 数据库的本质 # 本质上就是一款CS架构的软件 """ ...
- MySQL数据库之数据类型BOOL/BOOLEAN与TINYINT测试总结
From: http://database.51cto.com/art/201203/323863.htm 网络上很多人咨询mysql是否提供布尔类型?MySQL数据库确实提供布尔类型,此数据类型的关 ...
- MySQL数据库笔记二:数据类型及数据库操作
三.MySQL数据库数据类型 MySQL数据库中支持多种数据类型:数值型.字符型.日期型 常用的数据类型: 1.整型 int:整形,存储整数 int(M):M表示预期值.与存储大小和数值的范围无关. ...
- MySQL数据库具体一些操作
创建数据库:CREATE DATABASE 数据库名;删除数据库:drop database <数据库名>;选择使用(需要操作的数据库):use 数据库名称;mysql数据库数据类型:类型 ...
随机推荐
- Sqlplus常用指令
一.ORACLE的启动和关闭1.在单机环境下2.在双机环境下二.Oracle数据库有哪几种启动方式1.startup nomount 非安装启动,这种方式启动下可执行:重建控制文件.重建数据库2.st ...
- Oracle使用存储过程返回查询游标
如果报表逻辑非常复杂的话, 可以把报表逻辑放到存储过程里,加工一个全局临时表.前端查询的时候只查询临时表即可.只是第一次查询需要忍受加工的时间. --创建存储过程,返回SYS_REFCURSOR CR ...
- python smtp发邮件报错“[Errno -2] Name or service not known”的解决
最近给ss-py-mu写了个检查用户是否到期,并在到期前的第2天邮件提醒的功能. 配置存储在ini文件中,通过configparser模块获取,但尝试发送邮件的时候发现报错[Errno -2] Nam ...
- shell script 二 判断符号【】 shift 偏移量 if then fi
判断符号[]类似于test.但是[]有通配符及正则表达式,为了区分,利用[]来做判断时,前后都需要加空格来区分.又一个坑 [ -z "$HOME" ];echo $? 例: 1 r ...
- codeforces 1182E Product Oriented Recurrence 矩阵快速幂
题意:设f(n) = c ^ (2n - 6) * f(n - 1) * f(n - 2) * f(n - 3), 问第n项是多少? 思路:官方题解:我们先转化一下,令g(x) = c ^ x * ...
- 一些笔记jexcel
根据坐标或者指定列标题 jexcel.getColumnNameFromId([ x, y ]);
- es5-class
1. 通过class定义类/实现类的继承2. 在类中通过constructor定义构造方法3. 通过new来创建类的实例4. 通过extends来实现类的继承5. 通过super调用父类的构造方法6. ...
- json转换为map
// json转换为map public static Map parserToMap(String s) { Map map = new HashMap(); JSONObject json = J ...
- Spring注解详解(转)
概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO ...
- 【TCP】SYN攻击
TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确 ...