暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的SQL语句 - 数据定义语句(14)- CREATE TABLE 语句 (1)

数据库杂货铺 2021-04-12
604
CREATE TABLE 语句
 
    CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    (create_definition,...)
    [table_options]
    [partition_options]


    CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    [(create_definition,...)]
    [table_options]
    [partition_options]
    [IGNORE | REPLACE]
    [AS] query_expression


    CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    { LIKE old_tbl_name | (LIKE old_tbl_name) }


    create_definition: {
    col_name column_definition
    | {INDEX | KEY} [index_name] [index_type] (key_part,...)
    [index_option] ...
    | {FULLTEXT | SPATIAL} [INDEX | KEY] [index_name] (key_part,...)
    [index_option] ...
    | [CONSTRAINT [symbol]] PRIMARY KEY
    [index_type] (key_part,...)
    [index_option] ...
    | [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY]
    [index_name] [index_type] (key_part,...)
    [index_option] ...
    | [CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (col_name,...)
    reference_definition
    | check_constraint_definition
    }


    column_definition: {
    data_type [NOT NULL | NULL] [DEFAULT {literal | (expr)} ]
    [AUTO_INCREMENT] [UNIQUE [KEY]] [[PRIMARY] KEY]
    [COMMENT 'string']
    [COLLATE collation_name]
    [COLUMN_FORMAT {FIXED | DYNAMIC | DEFAULT}]
    [ENGINE_ATTRIBUTE [=] 'string']
    [SECONDARY_ENGINE_ATTRIBUTE [=] 'string']
    [STORAGE {DISK | MEMORY}]
    [reference_definition]
    [check_constraint_definition]
    | data_type
    [COLLATE collation_name]
    [GENERATED ALWAYS] AS (expr)
    [VIRTUAL | STORED] [NOT NULL | NULL]
    [UNIQUE [KEY]] [[PRIMARY] KEY]
    [COMMENT 'string']
    [reference_definition]
    [check_constraint_definition]
    }


    data_type:
    (see Chapter 11, Data Types)


    key_part: {col_name [(length)] | (expr)} [ASC | DESC]


    index_type:
    USING {BTREE | HASH}


    index_option: {
    KEY_BLOCK_SIZE [=] value
    | index_type
    | WITH PARSER parser_name
    | COMMENT 'string'
    | {VISIBLE | INVISIBLE}
    |ENGINE_ATTRIBUTE [=] 'string'
    |SECONDARY_ENGINE_ATTRIBUTE [=] 'string'
    }


    check_constraint_definition:
    [CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]


    reference_definition:
    REFERENCES tbl_name (key_part,...)
    [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
    [ON DELETE reference_option]
    [ON UPDATE reference_option]


    reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT


    table_options:
    table_option [[,] table_option] ...


    table_option: {
    AUTO_INCREMENT [=] value
    | AVG_ROW_LENGTH [=] value
    | [DEFAULT] CHARACTER SET [=] charset_name
    | CHECKSUM [=] {0 | 1}
    | [DEFAULT] COLLATE [=] collation_name
    | COMMENT [=] 'string'
    | COMPRESSION [=] {'ZLIB' | 'LZ4' | 'NONE'}
    | CONNECTION [=] 'connect_string'
    | {DATA | INDEX} DIRECTORY [=] 'absolute path to directory'
    | DELAY_KEY_WRITE [=] {0 | 1}
    | ENCRYPTION [=] {'Y' | 'N'}
    | ENGINE [=] engine_name
    | ENGINE_ATTRIBUTE [=] 'string'
    | INSERT_METHOD [=] { NO | FIRST | LAST }
    | KEY_BLOCK_SIZE [=] value
    | MAX_ROWS [=] value
    | MIN_ROWS [=] value
    | PACK_KEYS [=] {0 | 1 | DEFAULT}
    | PASSWORD [=] 'string'
    | ROW_FORMAT [=] {DEFAULT | DYNAMIC | FIXED | COMPRESSED | REDUNDANT | COMPACT}
    | SECONDARY_ENGINE_ATTRIBUTE [=] 'string'
    | STATS_AUTO_RECALC [=] {DEFAULT | 0 | 1}
    | STATS_PERSISTENT [=] {DEFAULT | 0 | 1}
    | STATS_SAMPLE_PAGES [=] value
    | TABLESPACE tablespace_name [STORAGE {DISK | MEMORY}]
    | UNION [=] (tbl_name[,tbl_name]...)
    }


    partition_options:
    PARTITION BY
    { [LINEAR] HASH(expr)
    | [LINEAR] KEY [ALGORITHM={1 | 2}] (column_list)
    | RANGE{(expr) | COLUMNS(column_list)}
    | LIST{(expr) | COLUMNS(column_list)} }
    [PARTITIONS num]
    [SUBPARTITION BY
    { [LINEAR] HASH(expr)
    | [LINEAR] KEY [ALGORITHM={1 | 2}] (column_list) }
    [SUBPARTITIONS num]
    ]
    [(partition_definition [, partition_definition] ...)]


    partition_definition:
    PARTITION partition_name
    [VALUES
    {LESS THAN {(expr | value_list) | MAXVALUE}
    |
    IN (value_list)}]
    [[STORAGE] ENGINE [=] engine_name]
    [COMMENT [=] 'string' ]
    [DATA DIRECTORY [=] 'data_dir']
    [INDEX DIRECTORY [=] 'index_dir']
    [MAX_ROWS [=] max_number_of_rows]
    [MIN_ROWS [=] min_number_of_rows]
    [TABLESPACE [=] tablespace_name]
    [(subpartition_definition [, subpartition_definition] ...)]


    subpartition_definition:
    SUBPARTITION logical_name
    [[STORAGE] ENGINE [=] engine_name]
    [COMMENT [=] 'string' ]
    [DATA DIRECTORY [=] 'data_dir']
    [INDEX DIRECTORY [=] 'index_dir']
    [MAX_ROWS [=] max_number_of_rows]
    [MIN_ROWS [=] min_number_of_rows]
    [TABLESPACE [=] tablespace_name]


    query_expression:
    SELECT ... (Some valid select or union statement)

    CREATE TABLE 用给定名称创建表。必须要具有表的 CREATE 权限。

     
    默认情况下,使用 InnoDB 存储引擎在默认数据库中创建表。如果表存在、没有默认数据库或数据库不存在,则会发生错误。
     
    MySQL对表的数量没有限制。底层文件系统可能对表示表的文件数有限制。每种存储引擎可能会施加特定于引擎的约束。InnoDB 允许多达40亿张表。
     
    在本节的以下主题中对 CREATE TABLE 语句的几个方面进行了描述:
     
    表名
     
     tbl_name
     
    在特定数据库中创建表,表名可以指定为 db_name.tbl_name。不管是否有默认数据库,都可以这样做,假设数据库存在。如果使用带引号的标识符,请分别引用数据库名和表名。例如,`mydb`.`mytbl`,而不是 `mydb.mytbl`
     
    ● IF NOT EXISTS
     
    防止表存在时发生错误。但是,无法验证现有表是否与 CREATE TABLE 语句所指定的结构相同。
     
    临时表
     
    创建表时可以使用 TEMPORARY 关键字。TEMPORARY 表仅在当前会话中可见,并在会话关闭时自动删除。
     
    表的克隆和复制
     
    LIKE
     
    使用 CREATE TABLE ... LIKE 语句根据另一个表的定义创建一个空表,包括原始表中定义的任何列属性和索引:
     
      CREATE TABLE new_tbl LIKE orig_tbl;
       
      [AS] query_expression
       
       
      要从另一个表创建一个表,请在 CREATE TABLE 语句的末尾添加 SELECT 语句:
       
        CREATE TABLE new_tbl AS SELECT * FROM orig_tbl;
         
        IGNORE | REPLACE
         
        IGNORE REPLACE 选项指示在使用 SELECT 语句复制表时如何处理重复的唯一键值的行。
         
        列数据类型和属性
         
        每个表有4096列的硬限制,但是对于给定的表,有效最大值可能更小,这还取决于其他因素。
         
         data_type
         
        data_type 表示列定义中的数据类型。有关指定列数据类型可用语法的完整描述,以及有关每种类型属性的信息,请参阅对数据类型的详细介绍。
         
         有些属性并不适用于所有数据类型。AUTO_INCREMENT 仅适用于整数和浮点类型。在 MySQL 8.0.13 之前,DEFAULT 不适用于 BLOBTEXTGEOMETRY JSON 类型。
         
         字符数据类型(CHARVARCHARTEXTENUMSET 类型以及他们的同义词)可以包含 CHARACTER SET 来指定列的字符集。CHARSET CHARACTER SET 的同义词。可以使用 COLLATE 属性以及其他属性指定字符集的排序规则。例子:
         
          CREATE TABLE t (c CHAR(20CHARACTER SET utf8 COLLATE utf8_bin);
           
          MySQL 8.0以字符形式解释字符列定义中的长度规范。BINARY VARBINARY 列的长度以字节为单位。
           
           对于 CHARVARCHARBINARY VARBINARY 列,可以只使用列值前导部分创建索引,使用 col_name(length) 语法指定索引前缀长度。BLOB TEXT 列也可以被索引,但必须指定前缀长度。非二进制字符串类型的前缀长度以字符为单位,二进制字符串类型以字节为单位。也就是说,对于CHARVARCHAR TEXT 列,索引项由每个列值的前 length 个字符组成,对于 BINARYVARBINARY BLOB 列,索引项由每个列值的前 length 个字节组成。只对列值的前缀进行索引可以使索引文件更小。
           
          只有 InnoDB MyISAM 存储引擎支持 BLOB TEXT 列的索引。例如:
            CREATE TABLE test (blob_col BLOBINDEX(blob_col(10)));
             
            如果指定的索引前缀超过列数据类型最大大小,则 CREATE TABLE 将按如下方式处理索引:
             
             对于非唯一索引,要么发生错误(如果启用了严格SQL模式),要么索引长度减小到列数据类型大小的最大值之内,并生成警告(如果未启用严格SQL模式)。
             
             对于唯一索引,无论SQL模式如何,都会发生错误,因为减少索引长度可能会导致插入不满足指定唯一性要求的非唯一项。
             
             无法为 JSON 列创建索引。可以通过在从 JSON 列中提取标量值的生成列上创建索引来突破此限制。
             
             NOT NULL | NULL
             
            如果未指定 NULL NOT NULL,则将该列视为已指定 NULL
             
            MySQL 8.0中,只有 InnoDBMyISAM MEMORY 存储引擎支持可以有 NULL 值的列创建索引。在其他情况下,必须将索引列声明为 NOT NULL,否则会报错。
             
             DEFAULT
             
            指定列的默认值。
             
            如果启用了 NO_ZERO_DATE NO_ZERO_IN_DATE SQL模式,并且日期默认值不符合该模式,则如果未启用严格SQL模式,则 CREATE TABLE 将生成警告;如果启用了严格模式,则会生成错误。例如,如果启用了 NO_ZERO_IN_DATEc1 DATE DEFAULT '2010-00-00' 这个语句将产生一个警告。
             
             AUTO_INCREMENT
             
            整数列或浮点列可以有属性 AUTO_INCREMENT。将 NULL(推荐)或0插入索引的 AUTO_INCREMENT 列时,该列将设置为下一个序列值。通常是 value+1,其中value是表中当前列的最大值。AUTO_INCREMENT 序列从1开始。
             
            若要在插入行后检索 AUTO_INCREMENT 值,请使用 LAST_INSERT_ID() SQL函数或 mysql_insert_id() C API 函数。
             
            如果启用了 NO_AUTO_VALUE_ON_ZERO SQL模式,则可以在 AUTO_INCREMENT 列中将0存储为0,而无需生成新的序列值。
             
            每个表只能有一个 AUTO_INCREMENT 列,必须对其进行索引,并且不能有 DEFAULT 值。只有当 AUTO_INCREMENT 列只包含正值时,它才能正常工作。插入一个负数被认为是插入一个非常大的正数。这样做是为了避免数字从正数转换到负数时出现精度问题,也为了确保不会意外地得到一个包含0AUTO_INCREMENT 列。
             
            对于 MyISAM 表,可以在包含多个列的键中指定 AUTO_INCREMENT 辅助列。
             
            要使 MySQL 与某些 ODBC 应用程序兼容,可以使用以下查询找到最后插入行的 AUTO_INCREMENT 值:
             
              SELECT * FROM tbl_name WHERE auto_col IS NULL
               
              此方法要求 sql_auto_is_null 变量未设置为0
               
               COMMENT
               
              可以使用 COMMENT 选项指定列的注释,最长1024个字符。可以用 SHOW CREATE TABLE SHOW FULL COLUMNS 语句显示注释。
               
               COLUMN_FORMAT
               
              NDB集群中,还可以使用 COLUMN_FORMAT NDB 表的某个列指定数据存储格式。允许的列格式有 FIXEDDYNAMIC DEFAULTFIXED 于指定固定宽度存储,DYNAMIC 允许列为可变宽度,而使用 DEFAULT 格式,可以基于列的数据类型来使用固定宽度还是可变宽度存储(可能被 ROW_FORMAT 说明符覆盖)。
               
              对于NDB表,COLUMN_FORMAT 的默认值是 FIXED
               
              NDB Cluster中,使用 COLUMN_FORMAT=FIXED 定义的列的最大可能偏移量为8188字节。
               
              COLUMN_FORMAT 当前对使用NDB以外的存储引擎的表的列没有影响。MySQL8.0会自动忽略 COLUMN_FORMAT
               
               ENGINE_ATTRIBUTE SECONDARY_ENGINE_ATTRIBUTE 选项(从MySQL 8.0.21开始提供)用于指定主存储引擎和辅助存储引擎的列属性。这些选项保留供将来使用。
               
              允许的值是包含有效JSON文档的字符串文本或空字符串('')。不接受无效的JSON
               
                CREATE TABLE t1 (c1 INT ENGINE_ATTRIBUTE='{"key":"value"}');
                 
                ENGINE_ATTRIBUTE SECONDARY_ENGINE_ATTRIBUTE 值可以重复而不会报错。在这种情况下,使用最后一个值。
                 
                服务器不会检查 ENGINE_ATTRIBUTE SECONDARY_ENGINE_ATTRIBUTE 值,也不会在更改表的存储引擎时清除它们。
                 
                 STORAGE
                 
                对于NDB表,可以使用 STORAGE 子句指定列是存储在磁盘上还是存储在内存中。STORAGE DISK 指定列存储在磁盘上,STORAGE MEMORY 指定内存存储。使用的 CREATE TABLE 语句必须仍然包含 TABLESPACE 子句:
                 
                  mysql> CREATE TABLE t1 (
                  -> c1 INT STORAGE DISK,
                  -> c2 INT STORAGE MEMORY
                  -> ) ENGINE NDB;
                  ERROR 1005 (HY000): Can't create table 'c.t1' (errno: 140)


                  mysql> CREATE TABLE t1 (
                  -> c1 INT STORAGE DISK,
                  -> c2 INT STORAGE MEMORY
                  -> ) TABLESPACE ts_1 ENGINE NDB;
                  Query OK, 0 rows affected (1.06 sec)
                   
                  对于NDB表,STORAGE DEFAULT 等价于 STORAGE MEMORY
                   
                  STORAGE 子句对使用 NDB 以外的存储引擎的表没有影响。只有提供 NDB Cluster mysqld 版本中才支持 STORAGE 关键字;在任何其他版本的MySQL中都无法识别该关键字,在其中尝试使用 STORAGE 关键字都会导致语法错误。
                   
                   GENERATED ALWAYS
                   
                  用于指定生成列表达式。
                   
                  可以为存储的生成列创建索引。InnoDB支持虚拟生成列的二级索引。
                   
                   
                   
                   
                   
                  官方地址:
                  https://dev.mysql.com/doc/refman/8.0/en/create-table.html
                   

                  文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论