生活随笔
收集整理的这篇文章主要介绍了
MySQL数据类型与操作
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
阅读目录
一、创建表的完整语法 二、MySQL基本数据类型
内容提要:
建表完整语法规范(create table 表格(字段名1 类型 (宽度) 约束条件)) MySQL数据库数据类型(整型、浮点型、字符类型(char与varchar)、日期类型、枚举与集合) 约束条件(primary key、unique key、not null、foreign key)
一、创建表的完整语法
语法:
create table 表名(
字段名1 类型 (宽度) 约束条件,
字段名2 类型 (宽度) 约束条件,
字段名3 类型 (宽度) 约束条件);
特别注意:
在同一张表中,字段名不能相同 宽度和约束条件为可选项,但是字段名和类型必须有 最后一个字段添加完毕后后面不能加逗号!
补充:1、这里的宽度是对存储数据的一种限制,在不同MySQL版本里面可能会出现不同的结果,这里只是不同版本的默认约束条件不一样导致,在最新版本5,7中如果输入数据
宽度超出限制,则会报错。
2、类型与约束条件的区别:类型是限制字段必须以什么样的数据类型存储,二约束条件是在这一类型之上添加一种额外的限制。 二、MySQL基本数据类型
整型(int)
分类:tinyint smallint mediumint int bigint 作用:储存年龄、等级、id、各种号码等 类型存储范围:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 注:如果你对python感兴趣,我这有个学习Python基地,里面有很多学习资料,感兴趣的
+ Q群:
895817687
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
mysql
> reate table t1
( id tinyint
) ;
mysql
> insert into t1 values
( 128 ) , ( - 129 ) ;
create table t2
( id tinyint unsigned
) ;
mysql
> insert into t2 values
( 0 ) , ( 255 ) ;
以下同理:
create table t3
( id int unsigned
) ;
mysql
> insert into t3 values
( 4294967296 ) ;
ERROR
1264 ( 22003 ) : Out of
range value
for column
'id' at row
1
mysql
> insert into t3 values
( 4294967295 ) ;
Query OK
, 1 row affected
( 0.01 sec
) 强调:对于整型来说,数据类型之后的宽度并不是存储限制,而是现实宽度限制,所以在创建表的时候,
如果字段采用的是整型类型,完全无需指定显示宽度,因为默认的显示宽度(
11 )
, 一般情况下,就足够显示完整的数据。
浮点型(分为float、double、decimal)
应用场景:身高、体重、薪资 字符限制特点(5,3),前一位表示所有的位数,后一位表示小数个数 区别对比:
float ( 255 , 30 )
double
( 255 , 30 )
decimal
( 65 , 30 )
mysql
> create table t9
( x
float ( 255 , 30 ) ) ;
mysql
> create table t10
( x double
( 255 , 30 ) ) ;
mysql
> create table t11
( x decimal
( 65 , 30 ) ) ; mysql
> insert into t9 values
( 1.111111111111111111111111111111 ) ;
mysql
> insert into t10 values
( 1.111111111111111111111111111111 ) ;
mysql
> insert into t11 values
( 1.111111111111111111111111111111 ) ;
mysql
> select
* from t9
;
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| x
|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| 1.111111164093017600000000000000 |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
1 row
in set ( 0.00 sec
) mysql
> select
* from t10
;
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| x
|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| 1.111111111111111200000000000000 |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
1 row
in set ( 0.00 sec
) mysql
> select
* from t11
;
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| x
|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| 1.111111111111111111111111111111 |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
1 row
in set ( 0.00 sec
) 从上面的查询创建的表中数据可以看出:
精度对比:decimal的精度最高,其次是double,最后是
float ,
但是就算是精度最低的
float 它的精度也有
16 位,所以一般使用完全能够应付
99 % 的数据场景。
字符类型(char定长与varchar变长)
作用:姓名、地址、描述类信息 理解通过实际使用来描述:
char:
mysql
> create table t12
( name char
( 4 ) ) ;
mysql
> insert into t12 values
( 'hello' ) ;
ERROR
1406 ( 22001 ) : Data too
long for column
'name' at row
1
mysql
> insert into t12 values
( 'hell' ) ;
Query OK
, 1 row affected
( 0.01 sec
)
mysql
> insert into t12 values
( 'he' ) ;
Query OK
, 1 row affected
( 0.00 sec
)
mysql
> select
* from t12
;
+ - - - - - - +
| name
|
+ - - - - - - +
| hell
|
| he
|
+ - - - - - - +
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
varchar:
mysql
> create table t13
( name varchar
( 4 ) ) ;
mysql
> insert into t13 values
( 'hello' ) ;
ERROR
1406 ( 22001 ) : Data too
long for column
'name' at row
1
mysql
> insert into t13 values
( 'hell' ) ;
Query OK
, 1 row affected
( 0.00 sec
)
mysql
> insert into t13 values
( 'he' ) ;
Query OK
, 1 row affected
( 0.01 sec
)
mysql
> select
* from t13
;
+ - - - - - - +
| name
|
+ - - - - - - +
| hell
|
| he
| + - - - - - - +
TIP:
select char_length
( name
) from t12
select char_length
( name
) from t13
"""首先应该肯定的是在硬盘上存的绝对是真正的数据,但显示的时候mysql会自动将末尾的空格取掉"""
set global sql_mode
= "strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH" ;
select char_length
( x
) from t12
;
select char_length
( y
) from t13
;
char 与 varchar 的使用区别
name char(5)
1:优点:浪费空间,每个name信息都是按照5个字符存,这样如果不够5个的也会用空格补全,造成存储空间浪费 2:缺点:存取速度很快,因为存储数据的结构固定,所以存取速度快。 3:egon alex lxx jxx txx 存用5个字符5个字符存,取的话也是5个字符为一部分取,准确快捷
name varchar(5)
缺点:存取速度慢,每个name信息按照可变长的形式去存,同时存的时候要在前面加入该字符长度的报头,一并存入,取的时候按照报头里的长度数据去取数据,比char多了好几步,所以存取数据相比较char会慢些。
优点:节省空间,通过可变长来存入,加上报头数据也不会造成空间的太多浪费 1bytes+egon 1bytes+alex 1bytes+lxx 1bytes+jxx 1bytes+txx
时间类型
分类:
mysql
> create table stu
( id int , name char
( 16 ) , birth_d date
, study_time time
, reg_time datetime
) ;
mysql
> insert into stu values
( 1 , 'jason' , '2019-05-09' , '11:11:11' , '2019-11-11 11:11"11' ) ;
Query OK
, 1 row affected
( 0.00 sec
) mysql
> select
* from stu
;
+ - - - - - - + - - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - +
| id | name
| birth_d
| study_time
| reg_time
|
+ - - - - - - + - - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - +
| 1 | jason
| 2019 - 05 - 09 | 11 : 11 : 11 | 2019 - 11 - 11 11 : 11 : 11 |
+ - - - - - - + - - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - +
1 row
in set ( 0.00 sec
)
枚举与集合类型: 分类
示例:
enum枚举:
mysql
> create table usr
( id int , name char
( 16 ) , gender enum
( 'male' , 'female' , 'others' ) ) ;
Query OK
, 0 rows affected
( 0.05 sec
)
mysql
> insert into usr values
( 1001 , 'jsson' , 'xxx' ) ;
ERROR
1265 ( 01000 ) : Data truncated
for column
'gender' at row
1
mysql
> insert into usr values
( 1001 , 'jsson' , 'male' ) ;
Query OK
, 1 row affected
( 0.01 sec
)
mysql
> insert into usr values
( 1002 , 'egon' , 'female' ) ;
Query OK
, 1 row affected
( 0.01 sec
)
mysql
> select
* from usr
;
+ - - - - - - + - - - - - - - + - - - - - - - - +
| id | name
| gender
|
+ - - - - - - + - - - - - - - + - - - - - - - - +
| 1001 | jsson
| male
|
| 1002 | egon
| female
|
+ - - - - - - + - - - - - - - + - - - - - - - - +
2 rows
in set ( 0.00 sec
)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
set 集合:
mysql
> create table tea
( id int , name char
( 16 ) , gender enum
( 'male' , 'female' , 'other' ) , hobby
set ( 'read' , 'sleep' , 'dbj' ) ) ;
Query OK
, 0 rows affected
( 0.04 sec
)
mysql
> insert into tea values
( 10011 , 'egon' , 'female' , 'read,dbj' ) ;
Query OK
, 1 row affected
( 0.01 sec
)
mysql
> insert into tea values
( 10012 , 'alex' , 'male' , 'dbj' ) ;
Query OK
, 1 row affected
( 0.05 sec
)
mysql
> select
* from tea
;
+ - - - - - - - + - - - - - - + - - - - - - - - + - - - - - - - - - - +
| id | name
| gender
| hobby
|
+ - - - - - - - + - - - - - - + - - - - - - - - + - - - - - - - - - - +
| 10011 | egon
| female
| read
, dbj
|
| 10012 | alex
| male
| dbj
|
+ - - - - - - - + - - - - - - + - - - - - - - - + - - - - - - - - - - +
2 rows
in set ( 0.00 sec
)
约束条件
PRIMARY KEY
( PK
) 标识该字段为该表的主键,可以唯一的标识记录
FOREIGN KEY
( FK
) 标识该字段为该表的外键
NOT NULL 标识该字段不能为空
UNIQUE KEY
( UK
) 标识该字段的值是唯一的
AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT 为该字段设置默认值
UNSIGNED 无符号
ZEROFILL 使用
0 填充
not null
+ defaultnot null
: 不为空
mysql
> create table us
( id int , name char
( 16 ) ) ;
Query OK
, 0 rows affected
( 0.05 sec
) mysql
> insert into us values
( 1 , null
) ;
Query OK
, 1 row affected
( 0.01 sec
) mysql
> desc us
;
+ - - - - - - - + - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - +
| Field
| Type
| Null
| Key
| Default
| Extra
|
+ - - - - - - - + - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - +
| id | int ( 11 ) | YES
| | NULL
| |
| name
| char
( 16 ) | YES
| | NULL
| |
+ - - - - - - - + - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - + mysql
> delete
from us where
id = 1 ;
Query OK
, 1 row affected
( 0.01 sec
) mysql
> alter table us modify name char
( 16 ) not null
;
Query OK
, 0 rows affected
( 0.05 sec
)
Records
: 0 Duplicates
: 0 Warnings
: 0 mysql
> desc us
;
+ - - - - - - - + - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - +
| Field
| Type
| Null
| Key
| Default
| Extra
|
+ - - - - - - - + - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - +
| id | int ( 11 ) | YES
| | NULL
| |
| name
| char
( 16 ) | NO
| | NULL
| |
+ - - - - - - - + - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - + mysql
> insert into us values
( 002 , null
) ;
ERROR
1048 ( 23000 ) : Column
'name' cannot be null
default 默认值
mysql
> create table st
( id int , name char
( 16 ) not null
, gender enum
( 'male' , 'female' ) default
'male' ) ;
Query OK
, 0 rows affected
( 0.03 sec
) mysql
> insert into st
( id , name
) values
( 1001 , 'lxx' ) ;
Query OK
, 1 row affected
( 0.01 sec
) mysql
> select
* from st
;
+ - - - - - - + - - - - - - + - - - - - - - - +
| id | name
| gender
|
+ - - - - - - + - - - - - - + - - - - - - - - +
| 1001 | lxx
| male
|
+ - - - - - - + - - - - - - + - - - - - - - - +
1 row
in set ( 0.00 sec
)
unique 某个字段对应的值在当前表中是唯一的,不能重复
mysql
> create table user1
( id int unique
, name char
( 16 ) ) ;
Query OK
, 0 rows affected
( 0.04 sec
) mysql
> insert into user1 values
( 1 , 'js' ) , ( 1 , 'eg' ) ;
ERROR
1062 ( 23000 ) : Duplicate entry
'1' for key
'id'
mysql
> insert into user1 values
( 1 , 'js' ) , ( 2 , 'eg' ) ;
Query OK
, 2 rows affected
( 0.00 sec
)
Records
: 2 Duplicates
: 0 Warnings
: 0
mysql
> create table server
( id int , ip char
( 16 ) , port
int , unique
( ip
, port
) ) ;
Query OK
, 0 rows affected
( 0.04 sec
) mysql
> desc server
;
+ - - - - - - - + - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - +
| Field
| Type
| Null
| Key
| Default
| Extra
|
+ - - - - - - - + - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - +
| id | int ( 11 ) | YES
| | NULL
| |
| ip
| char
( 16 ) | YES
| MUL
| NULL
| |
| port
| int ( 11 ) | YES
| | NULL
| |
+ - - - - - - - + - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - +
3 rows
in set ( 0.00 sec
) mysql
> insert into server values
( 1 , '127.0.0.1' , 8080 ) ;
Query OK
, 1 row affected
( 0.01 sec
) mysql
> insert into server values
( 2 , '127.0.0.1' , 8080 ) ;
ERROR
1062 ( 23000 ) : Duplicate entry
'127.0.0.1-8080' for key
'ip' mysql
> insert into server values
( 2 , '127.0.0.2' , 8080 ) ;
Query OK
, 1 row affected
( 0.00 sec
) mysql
> insert into server values
( 3 , '127.0.0.1' , 8081 ) ;
Query OK
, 1 row affected
( 0.00 sec
) mysql
> select
* from server
; 查看结果:
+ - - - - - - + - - - - - - - - - - - + - - - - - - +
| id | ip
| port
|
+ - - - - - - + - - - - - - - - - - - + - - - - - - +
| 1 | 127.0 .0 .1 | 8080 |
| 2 | 127.0 .0 .2 | 8080 |
| 3 | 127.0 .0 .1 | 8081 |
+ - - - - - - + - - - - - - - - - - - + - - - - - - +
3 rows
in set ( 0.00 sec
)
primary key+auto_increment(mysql数据类型及约束条件的重点内容,必须要掌握)
mysql
> create table tt1
( id int primary key
) ;
Query OK
, 0 rows affected
( 0.04 sec
) mysql
> desc tt1
;
+ - - - - - - - + - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - +
| Field
| Type
| Null
| Key
| Default
| Extra
|
+ - - - - - - - + - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - +
| id | int ( 11 ) | NO
| PRI
| NULL
| |
+ - - - - - - - + - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - +
1 row
in set ( 0.00 sec
) mysql
> insert into tt1 values
( 1 ) , ( 1 ) ;
ERROR
1062 ( 23000 ) : Duplicate entry
'1' for key
'PRIMARY'
mysql
> insert into tt1 values
( 1 ) , ( 2 ) ;
Query OK
, 2 rows affected
( 0.00 sec
)
Records
: 2 Duplicates
: 0 Warnings
: 0
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
重点内容:
一、一张表中必须有且只有一个主键,如果你没有设置主键,那么会从上到下搜索直到遇到一个非null且unique的字段自动将其设为主键。
mysql
> create table ts1
( id int , name char
( 16 ) , age
int not null unique
, addr char
( 16 ) not null unique
) engine
= innodb
;
Query OK
, 0 rows affected
( 0.04 sec
) mysql
> desc ts1
;
+ - - - - - - - + - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - +
| 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
| |
+ - - - - - - - + - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - +
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
二、如果表里面没有指定的任何可以设置的主键字段,那么innodb存储引擎会采用自己的默认的一个隐藏的字段作为主键,隐藏意味着你在查询的时候无法根据主键字段加速查询了
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
三、一张表中通常都应该有一个
id 字段,并且通常将
id 字段设为主键
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
额外知识点:
mysql
> create table ts2
( ip char
( 16 ) , port
int , primary key
( ip
, port
) ) ;
Query OK
, 0 rows affected
( 0.04 sec
) mysql
> desc ts2
;
+ - - - - - - - + - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - +
| Field
| Type
| Null
| Key
| Default
| Extra
|
+ - - - - - - - + - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - +
| ip
| char
( 16 ) | NO
| PRI
| NULL
| |
| port
| int ( 11 ) | NO
| PRI
| NULL
| |
+ - - - - - - - + - - - - - - - - - - + - - - - - - + - - - - - + - - - - - - - - - + - - - - - - - +
auto_increment 自增约束
mysql
> create table ts3
( id int primary key auto_increment
, name char
( 16 ) ) ;
Query OK
, 0 rows affected
( 0.05 sec
) mysql
> insert into ts3
( name
) values
( 'jason' ) , ( 'alex' ) , ( 'lxx' ) ;
Query OK
, 3 rows affected
( 0.01 sec
)
Records
: 3 Duplicates
: 0 Warnings
: 0 mysql
> select
* from ts3
;
+ - - - - + - - - - - - - +
| id | name
|
+ - - - - + - - - - - - - +
| 1 | jason
|
| 2 | alex
|
| 3 | lxx
|
+ - - - - + - - - - - - - +
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
补充:
接着上面的例子,如果我将其中一个字段比如lxx,删除后再添加字段,会出现:
mysql
> delete
from ts3 where
id = 3 ;
Query OK
, 1 row affected
( 0.01 sec
) mysql
> insert into ts3
( name
) values
( 'xxxx' ) ;
Query OK
, 1 row affected
( 0.01 sec
) mysql
> select
* from ts3
;
+ - - - - + - - - - - - - +
| id | name
|
+ - - - - + - - - - - - - +
| 1 | jason
|
| 2 | alex
|
| 4 | xxxx
|
+ - - - - + - - - - - - - +
3 rows
in set ( 0.00 sec
) tip:如果要清楚继续自增,从头开始的话,就必须清空表,才行。
mysql
> truncate ts3
;
Query OK
, 0 rows affected
( 0.03 sec
) mysql
> insert into ts3
( name
) values
( 'eeeee' ) ;
Query OK
, 1 row affected
( 0.01 sec
) mysql
> select
* from ts3
;
+ - - - - + - - - - - - - +
| id | name
|
+ - - - - + - - - - - - - +
| 1 | eeeee
|
+ - - - - + - - - - - - - +
我们刚刚在上面设置了char,tinyint,存储数据时超过它们的最大存储长度,发现数据也能正常存储进去,只是mysql帮我们自动截取了最大长度。但在实际情况下,我们应该尽量减少数据库的操作,缓解数据库的压力,让它仅仅只管理数据即可,这样的情况下就需要设置安全模式
show variables like
"%mode%" ;
set session
set global set global sql_mode
= 'STRICT_TRANS_TABLES'
总结
以上是生活随笔 为你收集整理的MySQL数据类型与操作 的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔 网站内容还不错,欢迎将生活随笔 推荐给好友。