---
order: 13
navTitle: create-table.ftl
---
# create-table.ftl

在create-table.ftl文件中构造一个SQL模板，使数据库支持`create table`语句。

```json
<#--创建表-->
CREATE TABLE ${tableName} (
<#list columns as col>
	<#--mysql的varchar,char类型字段值默认不区分大小写，不符合常规需求，需要设置BINARY使字段值区分大小写。-->
	<#assign isVarchar = col.dbType=="VARCHAR"||col.dbType=="CHAR" || col.dbType=='LONGTEXT'>
	${col.name+" "}<#rt>
	<#if col.autoInc!false>
		BIGINT NOT NULL AUTO_INCREMENT<#t>
	<#else>
		${col.typeDeclaration}<#if isVarchar> BINARY</#if><#t>
		<#if !col.nullable!true> NOT NULL</#if><#t>
		<#if col.defaultValue??> DEFAULT ${col.defaultValue}</#if><#t>
		<#if col.unique!false> UNIQUE</#if><#t>
	</#if>
	<#if col.comment??> COMMENT '${col.comment}'</#if><#t>
	<#if !col?is_last || primaryKey??>,</#if><#lt>
</#list>
<#if primaryKey??>	PRIMARY KEY (<#rt>
	<#list primaryKey.parts as part>
		${part.column}<#sep>, </#sep><#t>
	</#list>
	)<#lt>
</#if>
)<#if tableComment??> COMMENT '${tableComment}'</#if> ENGINE=InnoDB;
<#--创建索引-->
<#if indexes??>
<#list indexes as index>
	CREATE<#if index.unique!false> UNIQUE</#if> INDEX ${(index.name)!(index.aname)} ON ${tableName} (<#t>
		<#list index.parts as part>
			${part.column}<#sep>, </#sep><#t>
		</#list>
	);<#lt>
</#list>
</#if>
```

### SQL模板参数{#sql-template-parameters}

#### tableName{#tablename}

需要新建的数据库表表名。

#### createIfNotExists{#createifnotexists}

TODO

#### selectStatement{#selectstatement}

查询sql，存在此参数时说明要构造`create table xxx as select ...`语句，根据查询的SQL新建数据表，并在创建表的同时写入表数据。

#### likeTableName{#liketablename}

要复制表结构的源表名称，存在此参数就表示要构造`create table xxx like...`语句，此参数类似[tableName](#tablename)参数是一个完整的表名。

#### tableComment{#tablecomment}

表注释，为null时表示该表没有表注释，在Freemaker文件中该属性已经进行转义，可以通过`tableComment.value`属性访问未经转义的原值。

#### tableType{#tabletype}

数据库表类型，具体类型如下所示：

- `TABLE`：物理表，可以select和update数据
- `LOCAL_TEMPTABLE`：本地临时表，只在当前连接可见，当前连接物理关闭时删除
- `GLOBAL_TEMPTABLE`：全局临时表，所有连接可见，通常是引用过它的连接关闭时自动删除

#### columns{#columns}

字段列表，是一个数组对象，每一个元素都是一个字段。

属性如下：

- `name`：数据库表字段名。
- `comment`：字段注释，没有时返回`null`。
- `length`：字段长度
- `scale`：小数位位数，一般用于浮点型字段。
- `dbType`：字段类型，如`INT`、`VARCHAR`。
- `typeDeclaration`：带长度的字段类型的定义，如如`VARCHAR(12)`。
- `autoInc`：是否为自增长，为true表示自增长。
- `nullable`：能否为空，为true表示可以为空。
- `unsigned`：是否带有符号，true表示无符号，当为false时，可以存储负数。
- `defaultValue`：默认值，一般为一个单引号括起来的字符串或者是表达式。
- `primaryKey`：是否为主键，为true表示是主键。

#### primarKey{#primarkey}

设置主键字段，此处为一个索引对象，属性与[indexes](#indexes)中的索引对象一致。

#### indexes{#indexes}

索引列表，一般为一个数组对象，每一个元素都是一个索引。

属性如下：

- `name`：推荐索引名，可以为空，这里是建议索引名，如果元数据是从其他的库中读取的，该属性可能是索引在源库的索引名，若该索引名无法使用，会使用下面的`aname`作为新的索引名。
- `uname`：强制索引名，可以为空，当此属性存在时创建表应直接使用这里指定的索引名。
- `aname`：自动索引名，不可为空，当上述`name`属性无法使用时会使用这里自动生成的索引名，此索引不会和其他对象的索引名冲突。
- `unique`：是否为唯一索引。
- `cluster`：是否为聚集索引。
- `enable`：是否启用。
- `columns`：索引的字段列表。
  - `name`：索引的字段名。
  - `sort`：排序情况，默认为空，可以为空、DESC或者ASC。
