MySQL create table语法详解
前面在查建表时key和index的区别时,发现建表语句包含了太多信息,于是完整看看官方手册的这一小节。
该文章根据MySQL 5.7的手册作笔记,而MySQL 8.0该节地址如下:
https://dev.mysql.com/doc/refman/8.0/en/create-table.html
〇、概述
CREATE TABLE创建一个使用指定名称的table,当然前提是用户拥有CREATE权限。
常用的简单的建表语句:
/*建表的语法*/ 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)。
以下情况会报错:
- 当前没有使用任何数据库,或者要使用的数据库不存在;
- 数据库中已经存在同名表
关于表的物理表示的信息会在第二节讲述。
而创建表时,MySQL会存储原始的CREATE TABLE语句,包括所有规范和表选项。这是接下来第一节的内容
现在要谈到的是CREATE TABLE的以下几个方面:
- Table name
- Temporary Tables
- Cloning or Copying a Table
- Column Data Types and Attributes
- Indexes and Foreign Keys
- Table Options
- Creating Partitioned Tables
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
允许根据生成列进行分区。
一、CREATE TABLE Statement Retention(语句保留)