码迷,mamicode.com
首页 > 其他好文 > 详细

三 表操作

时间:2018-02-25 16:00:55      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:精准   组件   storage   ima   插入   medium   持久   工作   click   

一 存储引擎介绍

  一、什么是存储引擎

  二、MySQL支持的存储引擎

  三、使用存储引擎

二 表介绍、创建及查询

三 数据类型

  一、类型介绍

  二、数值类型

  三、日期类型

  四、字符串类型

  五、枚举类型与集合类型

四 表完整性约束

五 修改表ALTER TABLE

六 复制表

七 删除表

 

一 存储引擎介绍

一、什么是存储引擎

mysql中建立的库===>文件夹

库中建立的表===>文件

现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等

数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。

 

存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方
法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和
操作此表的类型)

在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql
数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据
自己的需要编写自己的存储引擎

技术分享图片

SQL 解析器、SQL 优化器、缓冲池、存储引擎等组件在每个数据库中都存在,但不是每 个数据库都有这么多存储引擎。MySQL 的插件式存储引擎可以让存储引擎层的开发人员设 计他们希望的存储层,例如,有的应用需要满足事务的要求,有的应用则不需要对事务有这 么强的要求 ;有的希望数据能持久存储,有的只希望放在内存中,临时并快速地提供对数据的查询。 

 

二、MySQL支持的存储引擎

1 MariaDB [(none)]> show engines\G  #查看所有支持的存储引擎
2 MariaDB [(none)]> show variables like storage_engine%; #查看正在使用的存储引擎

MySQL存储引擎介绍

 1 #InnoDB 存储引擎
 2 支持事务,其设计目标主要面向联机事务处理(OLTP)的应用。其
 3 特点是行锁设计、支持外键,并支持类似 Oracle 的非锁定读,即默认读取操作不会产生锁。 从 MySQL 5.5.8 版本开始是默认的存储引擎。
 4 InnoDB 存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒一样由 InnoDB 存储引擎自身来管理。从 MySQL 4.1(包括 4.1)版本开始,可以将每个 InnoDB 存储引擎的 表单独存放到一个独立的 ibd 文件中。此外,InnoDB 存储引擎支持将裸设备(row disk)用 于建立其表空间。
 5 InnoDB 通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了 SQL 标准 的 4 种隔离级别,默认为 REPEATABLE 级别,同时使用一种称为 netx-key locking 的策略来 避免幻读(phantom)现象的产生。除此之外,InnoDB 存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead) 等高性能和高可用的功能。
 6 对于表中数据的存储,InnoDB 存储引擎采用了聚集(clustered)的方式,每张表都是按 主键的顺序进行存储的,如果没有显式地在表定义时指定主键,InnoDB 存储引擎会为每一 行生成一个 6 字节的 ROWID,并以此作为主键。
 7 InnoDB 存储引擎是 MySQL 数据库最为常用的一种引擎,Facebook、Google、Yahoo 等 公司的成功应用已经证明了 InnoDB 存储引擎具备高可用性、高性能以及高可扩展性。对其 底层实现的掌握和理解也需要时间和技术的积累。如果想深入了解 InnoDB 存储引擎的工作 原理、实现和应用,可以参考《MySQL 技术内幕:InnoDB 存储引擎》一书。
 8 
 9 #MyISAM 存储引擎
10 不支持事务、表锁设计、支持全文索引,主要面向一些 OLAP 数 据库应用,在 MySQL 5.5.8 版本之前是默认的存储引擎(除 Windows 版本外)。数据库系统 与文件系统一个很大的不同在于对事务的支持,MyISAM 存储引擎是不支持事务的。究其根 本,这也并不难理解。用户在所有的应用中是否都需要事务呢?在数据仓库中,如果没有 ETL 这些操作,只是简单地通过报表查询还需要事务的支持吗?此外,MyISAM 存储引擎的 另一个与众不同的地方是,它的缓冲池只缓存(cache)索引文件,而不缓存数据文件,这与 大多数的数据库都不相同。
11 
12 #NDB 存储引擎
13 年,MySQL AB 公司从 Sony Ericsson 公司收购了 NDB 存储引擎。 NDB 存储引擎是一个集群存储引擎,类似于 Oracle 的 RAC 集群,不过与 Oracle RAC 的 share everything 结构不同的是,其结构是 share nothing 的集群架构,因此能提供更高级别的 高可用性。NDB 存储引擎的特点是数据全部放在内存中(从 5.1 版本开始,可以将非索引数 据放在磁盘上),因此主键查找(primary key lookups)的速度极快,并且能够在线添加 NDB 数据存储节点(data node)以便线性地提高数据库性能。由此可见,NDB 存储引擎是高可用、 高性能、高可扩展性的数据库集群系统,其面向的也是 OLTP 的数据库应用类型。
14 
15 #Memory 存储引擎
16 正如其名,Memory 存储引擎中的数据都存放在内存中,数据库重 启或发生崩溃,表中的数据都将消失。它非常适合于存储 OLTP 数据库应用中临时数据的临时表,也可以作为 OLAP 数据库应用中数据仓库的维度表。Memory 存储引擎默认使用哈希 索引,而不是通常熟悉的 B+ 树索引。
17 
18 #Infobright 存储引擎
19 第三方的存储引擎。其特点是存储是按照列而非行的,因此非常 适合 OLAP 的数据库应用。其官方网站是 http://www.infobright.org/,上面有不少成功的数据 仓库案例可供分析。
20 
21 #NTSE 存储引擎
22 网易公司开发的面向其内部使用的存储引擎。目前的版本不支持事务, 但提供压缩、行级缓存等特性,不久的将来会实现面向内存的事务支持。
23 
24 #BLACKHOLE
25 黑洞存储引擎,可以应用于主备复制中的分发主库。
26 
27 MySQL 数据库还有很多其他存储引擎,上述只是列举了最为常用的一些引擎。如果 你喜欢,完全可以编写专属于自己的引擎,这就是开源赋予我们的能力,也是开源的魅 力所在。

 

三、使用存储引擎

方法1:建表时指定

1 MariaDB [db1]> create table innodb_t1(id int,name char)engine=innodb;
2 MariaDB [db1]> create table innodb_t2(id int)engine=innodb;
3 MariaDB [db1]> show create table innodb_t1;
4 MariaDB [db1]> show create table innodb_t2;

方法2:在配置文件中指定默认的存储引擎

1 /etc/my.cnf
2 [mysqld]
3 default-storage-engine=INNODB
4 innodb_file_per_table=1

查看

1 [root@lucy db1]# cd /var/lib/mysql/db1/
2 [root@lucy db1]# ls
3 db.opt  innodb_t1.frm  innodb_t1.ibd  innodb_t2.frm  innodb_t2.ibd

练习

创建四个表,分别使用innodb,myisam,memory,blackhole存储引擎,进行插入数据测试

 1 MariaDB [db1]> create table t1(id int)engine=innodb;
 2 MariaDB [db1]> create table t2(id int)engine=myisam;
 3 MariaDB [db1]> create table t3(id int)engine=memory;
 4 MariaDB [db1]> create table t4(id int)engine=blackhole;
 5 MariaDB [db1]> quit
 6 [root@egon db1]# ls /var/lib/mysql/db1/ #发现后两种存储引擎只有表结构,无数据
 7 db.opt  t1.frm  t1.ibd  t2.MYD  t2.MYI  t2.frm  t3.frm  t4.frm
 8 
 9 #memory,在重启mysql或者重启机器后,表内数据清空
10 #blackhole,往表内插入任何数据,都相当于丢入黑洞,表内永远不存记录

 

二 表介绍、创建及查询

表介绍

表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段

创建表

#语法:
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);

#注意:
1. 在同一张表中,字段名是不能相同
2. 宽度和约束条件可选
3. 字段名和类型是必须的
MariaDB [(none)]> create database db1 charset utf8;

MariaDB [(none)]> use db1;

MariaDB [db1]> create table t1(  
    -> id int, 
    -> name varchar(50),
    -> sex enum(male,female),
    -> age int(3)
    -> );

MariaDB [db1]> show tables; #查看db1库下所有表名

MariaDB [db1]> desc t1;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type                  | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| id    | int(11)               | YES  |     | NULL    |       |
| name  | varchar(50)           | YES  |     | NULL    |       |
| sex   | enum(male,female) | YES  |     | NULL    |       |
| age   | int(3)                | YES  |     | NULL    |       |
+-------+-----------------------+------+-----+---------+-------+

MariaDB [db1]> select id,name,sex,age from t1;
Empty set (0.00 sec)

MariaDB [db1]> select * from t1;
Empty set (0.00 sec)

MariaDB [db1]> select id,name from t1;
Empty set (0.00 sec)
技术分享图片
 1 MariaDB [db1]> insert into t1 values
 2     -> (1,lucy,18,female),
 3     -> (2,anna,19,female)
 4     -> ;
 5 MariaDB [db1]> select * from t1;
 6 +------+------+------+--------+
 7 | id   | name | age  | sex    |
 8 +------+------+------+--------+
 9 |    1 | lucy |   18 | female   |
10 |    2 | anna |   19 | female |
11 +------+------+------+--------+
12 
13 
14 
15 MariaDB [db1]> insert into t1(id) values 
16     -> (3),
17     -> (4);
18 MariaDB [db1]> select * from t1;
19 +------+------+------+--------+
20 | id   | name | age  | sex    |
21 +------+------+------+--------+
22 |    1 | lucy |   18 | female   |
23 |    2 | anna |   19 | female |
24 |    3 | NULL | NULL | NULL   |
25 |    4 | NULL | NULL | NULL   |
26 +------+------+------+--------+
往表中插入数据

注意:表中的最后一个字段不要加逗号 

 

查询

 1 MariaDB [db1]> describe t1; #查看表结构,可简写为desc 表名
 2 +-------+-----------------------+------+-----+---------+-------+
 3 | Field | Type                  | Null | Key | Default | Extra |
 4 +-------+-----------------------+------+-----+---------+-------+
 5 | id    | int(11)               | YES  |     | NULL    |       |
 6 | name  | varchar(50)           | YES  |     | NULL    |       |
 7 | sex   | enum(male,female) | YES  |     | NULL    |       |
 8 | age   | int(3)                | YES  |     | NULL    |       |
 9 +-------+-----------------------+------+-----+---------+-------+
10 
11 
12 MariaDB [db1]> show create table t1\G; #查看表详细结构,可加\G

 

三 数据类型

一、类型介绍

存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的。

mysql常用数据类型概览

 1 #1. 数字:
 2     整型:tinyinit  int  bigint
 3     小数:
 4         float :在位数比较短的情况下不精准
 5         double :在位数比较长的情况下不精准
 6             0.000001230123123123
 7             存成:0.000001230000
 8 
 9         decimal:(如果用小数,则用推荐使用decimal)
10             精准
11             内部原理是以字符串形式去存
12 
13 #2. 字符串:
14     char10):简单粗暴,浪费空间,存取速度快
15         root存成root000000
16     varchar:精准,节省空间,存取速度慢
17 
18     sql优化:创建表时,定长的类型往前放,变长的往后放
19                     比如性别           比如地址或描述信息
20 
21     >255个字符,超了就把文件路径存放到数据库中。
22             比如图片,视频等找一个文件服务器,数据库中只存路径或url。
23 
24 
25 
26 #3. 时间类型:
27     最常用:datetime
28 
29 
30 #4. 枚举类型与集合类型

 

二、数值类型

1、整数类型

整数类型:TINYINT SMALLINT MEDIUMINT INT BIGINT

作用:存储年龄,等级,id,各种号码等

 1 ========================================
 2         tinyint[(m)] [unsigned] [zerofill]
 3 
 4             小整数,数据类型用于保存一些范围的整数数值范围:
 5             有符号:
 6                 -128127
 7             无符号:
 8255
 9 
10             PS: MySQL中无布尔值,使用tinyint(1)构造。
11 
12 
13 
14 ========================================
15         int[(m)][unsigned][zerofill]
16 
17             整数,数据类型用于保存一些范围的整数数值范围:
18             有符号:
19                     -21474836482147483647
20             无符号:
214294967295
22 
23 
24 
25 ========================================
26         bigint[(m)][unsigned][zerofill]
27             大整数,数据类型用于保存一些范围的整数数值范围:
28             有符号:
29                     -92233720368547758089223372036854775807
30             无符号:
3118446744073709551615
技术分享图片
  1 =========有符号和无符号tinyint==========
  2 #tinyint默认为有符号
  3 MariaDB [db1]> create table t1(x tinyint); #默认为有符号,即数字前有正负号
  4 MariaDB [db1]> desc t1;
  5 MariaDB [db1]> insert into t1 values
  6     -> (-129),
  7     -> (-128),
  8     -> (127),
  9     -> (128);
 10 MariaDB [db1]> select * from t1;
 11 +------+
 12 | x    |
 13 +------+
 14 | -128 | #-129存成了-128
 15 | -128 | #有符号,最小值为-128
 16 |  127 | #有符号,最大值127
 17 |  127 | #128存成了127
 18 +------+
 19 
 20 
 21 
 22 #设置无符号tinyint
 23 MariaDB [db1]> create table t2(x tinyint unsigned);
 24 MariaDB [db1]> insert into t2 values
 25     -> (-1),
 26     -> (0),
 27     -> (255),
 28     -> (256);
 29 MariaDB [db1]> select * from t2;
 30 +------+
 31 | x    |
 32 +------+
 33 |    0 | -1存成了0
 34 |    0 | #无符号,最小值为0
 35 |  255 | #无符号,最大值为255
 36 |  255 | #256存成了255
 37 +------+
 38 
 39 
 40 
 41 ============有符号和无符号int=============
 42 #int默认为有符号
 43 MariaDB [db1]> create table t3(x int); #默认为有符号整数
 44 MariaDB [db1]> insert into t3 values
 45     -> (-2147483649),
 46     -> (-2147483648),
 47     -> (2147483647),
 48     -> (2147483648);
 49 MariaDB [db1]> select * from t3;
 50 +-------------+
 51 | x           |
 52 +-------------+
 53 | -2147483648 | #-2147483649存成了-2147483648
 54 | -2147483648 | #有符号,最小值为-2147483648
 55 |  2147483647 | #有符号,最大值为2147483647
 56 |  2147483647 | #2147483648存成了2147483647
 57 +-------------+
 58 
 59 
 60 
 61 #设置无符号int
 62 MariaDB [db1]> create table t4(x int unsigned);
 63 MariaDB [db1]> insert into t4 values
 64     -> (-1),
 65     -> (0),
 66     -> (4294967295),
 67     -> (4294967296);
 68 MariaDB [db1]> select * from t4;
 69 +------------+
 70 | x          |
 71 +------------+
 72 |          0 | #-1存成了0
 73 |          0 | #无符号,最小值为0
 74 | 4294967295 | #无符号,最大值为4294967295
 75 | 4294967295 | #4294967296存成了4294967295
 76 +------------+
 77 
 78 
 79 
 80 
 81 ==============有符号和无符号bigint=============
 82 MariaDB [db1]> create table t6(x bigint);
 83 MariaDB [db1]> insert into t5 values  
 84     -> (-9223372036854775809),
 85     -> (-9223372036854775808),
 86     -> (9223372036854775807),
 87     -> (9223372036854775808);
 88 
 89 MariaDB [db1]> select * from t5;
 90 +----------------------+
 91 | x                    |
 92 +----------------------+
 93 | -9223372036854775808 |
 94 | -9223372036854775808 |
 95 |  9223372036854775807 |
 96 |  9223372036854775807 |
 97 +----------------------+
 98 
 99 
100 
101 MariaDB [db1]> create table t6(x bigint unsigned);
102 MariaDB [db1]> insert into t6 values  
103     -> (-1),
104     -> (0),
105     -> (18446744073709551615),
106     -> (18446744073709551616);
107 
108 MariaDB [db1]> select * from t6;
109 +----------------------+
110 | x                    |
111 +----------------------+
112 |                    0 |
113 |                    0 |
114 | 18446744073709551615 |
115 | 18446744073709551615 |
116 +----------------------+
117 
118 
119 
120 
121 ======用zerofill测试整数类型的显示宽度=============
122 MariaDB [db1]> create table t7(x int(3) zerofill);
123 MariaDB [db1]> insert into t7 values
124     -> (1),
125     -> (11),
126     -> (111),
127     -> (1111);
128 MariaDB [db1]> select * from t7;
129 +------+
130 | x    |
131 +------+
132 |  001 |
133 |  011 |
134 |  111 |
135 | 1111 | #超过宽度限制仍然可以存
136 +------+
验证

注意:为该类型指定宽度时,仅仅只是指定查询结果的显示宽度,与存储范围无关,存储范围如下

其实我们完全没必要为整数类型指定显示宽度,使用默认的就可以了

默认的显示宽度,都是在最大值的基础上加1

技术分享图片

int的存储宽度是4个Bytes,即32个bit,即2**32

无符号最大值为:4294967296-1

有符号最大值:2147483648-1

有符号和无符号的最大数字需要的显示宽度均为10,而针对有符号的最小值则需要11位才能显示完全,所以int类型默认的显示宽度为11是非常合理的

最后:整形类型,其实没有必要指定显示宽度,使用默认的就ok

2、浮点型

定点数类型  DEC等同于DECIMAL  

浮点类型:FLOAT DOUBLE

作用:存储薪资、身高、体重、体质参数等

技术分享图片
 1 ======================================
 2 #FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
 3 
 4 定义:
 5         单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30
 6 
 7 有符号:
 8            -3.402823466E+38 to -1.175494351E-38,
 9            1.175494351E-38 to 3.402823466E+38
10 无符号:
11            1.175494351E-38 to 3.402823466E+38
12 
13 
14 精确度: 
15            **** 随着小数的增多,精度变得不准确 ****
16 
17 
18 ======================================
19 #DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
20 
21 定义:
22            双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30
23 
24 有符号:
25            -1.7976931348623157E+308 to -2.2250738585072014E-308
26            2.2250738585072014E-308 to 1.7976931348623157E+308
27 
28 无符号:
29            2.2250738585072014E-308 to 1.7976931348623157E+308
30             
31 精确度:
32            ****随着小数的增多,精度比float要高,但也会变得不准确 ****
33 
34 ======================================
35 decimal[(m[,d])] [unsigned] [zerofill]
36 
37 定义:
38           准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。
39 
40 
41 精确度:
42            **** 随着小数的增多,精度始终准确 ****
43            对于精确数值计算时需要用此类型
44            decaimal能够存储精确值的原因在于其内部按照字符串存储。
View Code
技术分享图片
 1 mysql> create table t1(x float(256,31));
 2 ERROR 1425 (42000): Too big scale 31 specified for column x. Maximum is 30.
 3 mysql> create table t1(x float(256,30));
 4 ERROR 1439 (42000): Display width out of range for column x (max = 255)
 5 mysql> create table t1(x float(255,30)); #建表成功
 6 Query OK, 0 rows affected (0.02 sec)
 7 
 8 mysql> create table t2(x double(255,30)); #建表成功
 9 Query OK, 0 rows affected (0.02 sec)
10 
11 mysql> create table t3(x decimal(66,31));
12 ERROR 1425 (42000): Too big scale 31 specified for column x. Maximum is 30.
13 mysql> create table t3(x decimal(66,30));
14 ERROR 1426 (42000): Too-big precision 66 specified for x. Maximum is 65.
15 mysql> create table t3(x decimal(65,30)); #建表成功
16 Query OK, 0 rows affected (0.02 sec)
17 
18 mysql> show tables;
19 +---------------+
20 | Tables_in_db1 |
21 +---------------+
22 | t1            |
23 | t2            |
24 | t3            |
25 +---------------+
26 rows in set (0.00 sec)
27 
28 
29 
30 mysql> insert into t1 values(1.1111111111111111111111111111111); #小数点后31个1
31 Query OK, 1 row affected (0.01 sec)
32 
33 mysql> insert into t2 values(1.1111111111111111111111111111111);
34 Query OK, 1 row affected (0.00 sec)
35 
36 mysql> insert into t3 values(1.1111111111111111111111111111111);
37 Query OK, 1 row affected, 1 warning (0.01 sec)
38 
39 mysql> select * from t1; #随着小数的增多,精度开始不准确
40 +----------------------------------+
41 | x                                |
42 +----------------------------------+
43 | 1.111111164093017600000000000000 |
44 +----------------------------------+
45 row in set (0.00 sec)
46 
47 mysql> select * from t2; #精度比float要准确点,但随着小数的增多,同样变得不准确
48 +----------------------------------+
49 | x                                |
50 +----------------------------------+
51 | 1.111111111111111200000000000000 |
52 +----------------------------------+
53 row in set (0.00 sec)
54 
55 mysql> select * from t3; #精度始终准确,d为30,于是只留了30位小数
56 +----------------------------------+
57 | x                                |
58 +----------------------------------+
59 | 1.111111111111111111111111111111 |
60 +----------------------------------+
61 row in set (0.00 sec)
验证

3、位类型(了解)

BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写默认为1位。
注意:对于位字段需要使用函数读取
    bin()显示为二进制
    hex()显示为十六进制

技术分享图片
 1 MariaDB [db1]> create table t9(id bit);
 2 MariaDB [db1]> desc t9; #bit默认宽度为1
 3 +-------+--------+------+-----+---------+-------+
 4 | Field | Type   | Null | Key | Default | Extra |
 5 +-------+--------+------+-----+---------+-------+
 6 | id    | bit(1) | YES  |     | NULL    |       |
 7 +-------+--------+------+-----+---------+-------+
 8 
 9 MariaDB [db1]> insert into t9 values(8);
10 MariaDB [db1]> select * from t9; #直接查看是无法显示二进制位的
11 +------+
12 | id   |
13 +------+
14 |     |
15 +------+
16 MariaDB [db1]> select bin(id),hex(id) from t9; #需要转换才能看到
17 +---------+---------+
18 | bin(id) | hex(id) |
19 +---------+---------+
20 | 1       | 1       |
21 +---------+---------+
22 
23 MariaDB [db1]> alter table t9 modify id bit(5);
24 MariaDB [db1]> insert into t9 values(8);
25 MariaDB [db1]> select bin(id),hex(id) from t9;
26 +---------+---------+
27 | bin(id) | hex(id) |
28 +---------+---------+
29 | 1       | 1       |
30 | 1000    | 8       |
31 +---------+---------+
验证

 

三、日期类型

DATE TIME DATETIME TIMESTAMP YEAR 

作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等

技术分享图片
 1 YEAR
 2             YYYY(1901/2155 3 
 4         DATE
 5             YYYY-MM-DD(1000-01-01/9999-12-31 6 
 7         TIME
 8             HH:MM:SS(-838:59:59/838:59:59 9 
10         DATETIME
11 
12             YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59    Y)
13 
14         TIMESTAMP
15 
16             YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)
View Code
技术分享图片
 1 ============year===========
 2 MariaDB [db1]> create table t10(born_year year); #无论year指定何种宽度,最后都默认是year(4)
 3 MariaDB [db1]> insert into t10 values  
 4     -> (1900),
 5     -> (1901),
 6     -> (2155),
 7     -> (2156);
 8 MariaDB [db1]> select * from t10;
 9 +-----------+
10 | born_year |
11 +-----------+
12 |      0000 |
13 |      1901 |
14 |      2155 |
15 |      0000 |
16 +-----------+
17 
18 
19 ============date,time,datetime===========
20 MariaDB [db1]> create table t11(d date,t time,dt datetime);
21 MariaDB [db1]> desc t11;
22 +-------+----------+------+-----+---------+-------+
23 | Field | Type     | Null | Key | Default | Extra |
24 +-------+----------+------+-----+---------+-------+
25 | d     | date     | YES  |     | NULL    |       |
26 | t     | time     | YES  |     | NULL    |       |
27 | dt    | datetime | YES  |     | NULL    |       |
28 +-------+----------+------+-----+---------+-------+
29 
30 MariaDB [db1]> insert into t11 values(now(),now(),now());
31 MariaDB [db1]> select * from t11;
32 +------------+----------+---------------------+
33 | d          | t        | dt                  |
34 +------------+----------+---------------------+
35 | 2017-07-25 | 16:26:54 | 2017-07-25 16:26:54 |
36 +------------+----------+---------------------+
37 
38 
39 
40 ============timestamp===========
41 MariaDB [db1]> create table t12(time timestamp);
42 MariaDB [db1]> insert into t12 values();
43 MariaDB [db1]> insert into t12 values(null);
44 MariaDB [db1]> select * from t12;
45 +---------------------+
46 | time                |
47 +---------------------+
48 | 2017-07-25 16:29:17 |
49 | 2017-07-25 16:30:01 |
50 +---------------------+
51 
52 
53 
54 ============注意啦,注意啦,注意啦===========
55 1. 单独插入时间时,需要以字符串的形式,按照对应的格式插入
56 2. 插入年份时,尽量使用4位值
57 3. 插入两位年份时,<=69,以20开头,比如50,  结果2050      
58                 >=70,以19开头,比如71,结果1971
59 MariaDB [db1]> create table t12(y year);
60 MariaDB [db1]> insert into t12 values  
61     -> (50),
62     -> (71);
63 MariaDB [db1]> select * from t12;
64 +------+
65 | y    |
66 +------+
67 | 2050 |
68 | 1971 |
69 +------+
70 
71 
72 
73 ============综合练习===========
74 MariaDB [db1]> create table student(
75     -> id int,
76     -> name varchar(20),
77     -> born_year year,
78     -> birth date,
79     -> class_time time,
80     -> reg_time datetime);
81 
82 MariaDB [db1]> insert into student values
83     -> (1,lucy,"1995","1995-11-11","11:11:11","2017-11-11 11:11:11"),
84     -> (2,anna,"1997","1997-12-12","12:12:12","2017-12-12 12:12:12"),
85     -> (3,luna,"1998","1998-01-01","13:13:13","2017-01-01 13:13:13");
86 
87 MariaDB [db1]> select * from student;
88 +------+------+-----------+------------+------------+---------------------+
89 | id   | name | born_year | birth      | class_time | reg_time            |
90 +------+------+-----------+------------+------------+---------------------+
91 |    1 | lucy |      1995 | 1995-11-11 | 11:11:11   | 2017-11-11 11:11:11 |
92 |    2 | anna |      1997 | 1997-12-12 | 12:12:12   | 2017-12-12 12:12:12 |
93 |    3 | luna  |      1998 | 1998-01-01 | 13:13:13   | 2017-01-01 13:13:13 |
94 +------+------+-----------+------------+------------+---------------------+
验证
技术分享图片
1 在实际应用的很多场景中,MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣。下面就来总结一下两种日期类型的区别。
2 
3 1.DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。
4 
5 2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,操作系统以及客户端连接都有时区的设置。
6 
7 3.DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率更高。
8 
9 4.DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。
datetime与timestamp的区别

 

三 表操作

标签:精准   组件   storage   ima   插入   medium   持久   工作   click   

原文地址:https://www.cnblogs.com/eric_yi/p/8469385.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!