2. create table
语法:
CREATE TABLE创建一个具有给定名称的表。你必须具有表的CREATE权限。
默认情况下,CREATE TABLE会在默认数据库创建表,且使用的是InnoDB存储引擎。如果表已经存在,或者没有默认数据库,或者指定的数据库不存在,则返回错误。
MySQL会存储表创建时原始的CREATE TABLE语句,包括所有说明和表选项。
本节将讨论CREATE TABLE的以下几个方面:
表名
临时表
复制表
列数据类型及属性
索引和外键
表选项
创建分区表
表名
tbl_name
可以将表名称指定为db_name.tbl_name以期在特定数据库中创建表。只要目标数据库存在,那么不论是否指定了默认数据库,这种方法都有效。如果你在名字里面使用了引用标识符,那么就需要分别引用数据库名和表名。例如,`mydb`.`mytbl`,而不能是`mydb.mytbl`
IF NOT EXISTS
如果表已经存在,则防止发生错误。注意,MySQL并不会验证现有表结构与CREATE TABLE语句指定的表结构是否相同。
临时表
创建表时可以使用关键字TEMPORARY。临时表仅在当前会话中可见,并在会话关闭时自动删除。
复制表
LIKE
可以使用CREATE TABLE ... LIKE语句根据另一个表的定义创建一个空表,该空表将包含原表所有的列属性和索引:
[AS] query_expression
要从另一个表中创建一个新表,可以在CREATE TABLE语句的末尾添加一个SELECT语句:
IGNORE | REPLACE
当使用SELECT语句复制表时,IGNORE和REPLACE选项用于指示如何处理导致唯一键产生重复的行。
列数据类型及属性
理论上每个表的列数的上限是4096,但是对于一个给定的表来说,有效的最大值可能比该值要小。
data_type
data_type表示列定义中的数据类型,spatial_type表示空间数据类型。
某些属性不适用于所有数据类型。AUTO_INCREMENT只适用于整数和浮点数类型。DEFAULT不适用于TEXT或BLOB类型;
字符数据类型(CHAR, VARCHAR, TEXT)可以包含CHARACTER SET和COLLATE属性以指定列的字符集和排序规则。其中,CHARSET等同于CHARACTER SET。例如:
MySQL5.5将字符列定义中的长度说明解释为字符数;将二进制字符列(BINARY和VARBINARY)定义中的长度说明解释为字节数
对于CHAR, VARCHAR, BINARY和VARBINARY列,可以创建仅使用列值前缀的索引,可以使用col_name(length)语法指定索引前缀的长度。TEXT和BLOB列也可以被索引,但必须指定前缀长度。对于非二进制字符串类型,前缀长度是字符数;对于二进制字符串类型,前缀长度是字节数。也就是说,对于CHAR, VARCHAR和TEXT列,索引项由列值的前length个字符组成;对于BINARY, VARBINARY和BLOB列,索引项由列值的前length个字节组成。前缀索引可以使索引文件更小。
只有InnoDB和MyISAM存储引擎支持对TEXT和BLOB列进行索引。例如:
NOT NULL | NULL
一个列如果既没有指定NULL,也没有指定NOT NULL,则等同于指定了NULL。
在MySQL 5.5中,只有InnoDB,MyISAM和MEMORY存储引擎支持索引可为NULL的列。其它情况下,你必须将索引列声明为NOT NULL,否则会出错
DEFAULT
指定列的默认值。默认值必须是常量,不能是函数或表达式。这意味着,你不能将一个DATE列的默认值设置为诸如NOW()或CURRENT_DATE之类的函数的值。例外是可以将CURRENT_TIMESTAMP指定为TIMESTAMP列的默认值。
如果列定义没有显式的DEFAULT值,则MySQL将按照第11.6节“数据类型默认值”中所描述的来确定默认值。
TEXT和BLOB列不能指定默认值
如果日期的默认值不符合NO_ZERO_IN_DATE SQL模式,则CREATE TABLE将失败,即使并没有启用严格的SQL模式。例如,c1 DATE DEFAULT '2010-00-00' 将导致CREATE TABLE失败,错误信息为:Invalid default value for 'c1'
AUTO_INCREMENT