前面在查建表时key和index的区别时,发现建表语句包含了太多信息,因而完整看看官方手册的这一小节。html
该文章根据MySQL 5.7的手册做笔记,而MySQL 8.0该节地址以下:mysql
https://dev.mysql.com/doc/refman/8.0/en/create-table.htmlsql
〇、概述数据库
CREATE TABLE建立一个使用指定名称的table,固然前提是用户拥有CREATE权限。express
经常使用的简单的建表语句:优化
/*建表的语法*/ create table [if not exist] Table_name( 字段一 数据类型 [字段属性|约束] [索引] [注释] , 字段二 数据类型 [字段属性|约束] [索引] [注释] , ......... )[表类型][表字符集][注释] /*建立一个InnoDB类型,字符集为utf-8,备注为“test Table”的表*/ /*在这里,我惊喜地发现,单引号、双引号能够使用在comment关键字中!!*/ create table test(id int(4))engine=innodb,charset=utf8,comment="test Table";
默认状况下,表会建立在当前数据库下(use database决定当前使用的数据库),并使用默认的存储引擎(InnoDB)。spa
如下状况会报错:code
关于表的物理表示的信息会在第二节讲述。htm
而建立表时,MySQL会存储原始的CREATE TABLE语句,包括全部规范和表选项。这是接下来第一节的内容blog
如今要谈到的是CREATE TABLE的如下几个方面:
0.1 Table Name
关于Table_name:
能够被指定为database_name.table_name,就能够直接在指定的数据库中建立表。
固然,若是要使用引号,对db_name和tb_name都要使用引号,`da_name`.`tb_name`。(事实上,这里的并非‘’这种符号,而是键盘上左上角的“~”键)
table名的命名规约在9.2章节。
关于 IF NOT EXISTS:
阻止错误发生。尽管并不会验证已经存在的表是否与要建立的表具备彻底一致的表结构。
0.2 Temporary Tables
能够在建表时使用“Temporary ”关键字,那么所建立的临时表只会在当前会话中可见,会话关闭后,该数据库就会被自动删除。
0.3 Cloning or Copying a Table
Like
使用“create table ... like”来基于其它表的定义建立一个空表,新表包括了列的全部属性有以及索引。
CREATE TABLE new_tbl LIKE orig_tbl;
[as] query_expression
根据一个查询结果集,建立一个包含这些数据的新表。
CREATE TABLE new_tbl AS SELECT * FROM orig_tbl;
IGNORE | REPLACE
这两个选项代表,当根据select语句建立表时,该如何处理复制惟一键值的行。(how to handle rows that duplicate unique key values when copying a table using a SELECT statement.)
0.4 Column Data Types and Attributes
这些就是表的字段定义了。字段的数据类型、属性等。
每一个表的硬限制为4096列,但实际上限会小一些,着取决于一些其它因素。
这里的选项太多,稍后再聊。
0.5 Indexs And Foreign Keys
0.6 Table Options
Table Options被用来对表的行为进行优化。
在大多数状况下,不须要指定任何选项。
这些选项会应用于全部的存储引擎,除非特别指出。若一个表决定不该用这些选项,这会被记做表定义的一部分。若是稍后使用ALTER TABLE将表转换为使用不一样的存储引擎,则又能够应用这些选项。
表选项也特别多,常见的如指定engine、charset。
0.7 Creating Partitioned Tables
可用于控制使用CREATE TABLE建立的表的分区。
选项也不少
0.8 Partitioning by Generated Columns
容许根据生成列进行分区。
1、CREATE TABLE Statement Retention(语句保留)