DDL语句
huiche-ddl支持多种语句,用于建表或调整表结构
建表语句
org.huiche.ddl.statement.CreateTable 默认语法为
CREATE TABLE table_name(
column_name type[(length,scale)] [auto_increment] [NOT_NULL] [UNIQUE] [DEFAULT default_value] [COMMENT col_comment],
[column_name type[(length,scale)] [auto_increment] [NOT_NULL] [UNIQUE] [DEFAULT default_value] [COMMENT col_comment],]
[PRIMARY KEY(col_name[,col_name...])]
[COMMENT 'table_comment']
)auto_increment根据方言不同,使用不同的SQL片段
- 默认
GENERATED BY DEFAULT AS IDENTITY MySQL,MariaDB,DM达梦AUTO_INCREMENTSQLServerIDENTITY(1,1)SQLitePRIMARY KEY AUTOINCREMENT, SQLite自增必须同时是唯一主键,唯一主键时不支持PRIMARY KEY(col_name[,col_name...])语法,只支持列中定义
表注释 根据方言不同
- 默认 脱离建表语句,单独使用
ALTER TABLE table_name COMMENT table_comment MySQL,MariaDB直接在建表语句中
列注释 根据方言不同
- 默认 脱离建表语句, 单独使用
COMMENT ON COLUMN table_name.column IS column_comment MySQL,MariaDB直接在建表语句中
表结构差异语句
特殊说明
- 自增修改,只有
MySQL和MariaDB支持,包括实际使用MySQL方言的数据库,如Oceanbase的MySQL模式,其他数据库均会忽略 - DB2执行表结构差异语句后,大部分语句会自动附带一个表重组语句,下面不再说明
CALL SYSPROC.ADMIN_CMD('REORG TABLE table_name')添加列
org.huiche.ddl.statement.AddColumn 默认语法为
ALTER TABLE table_name ADD column_name type[(length,scale)] [auto_increment] [NOT_NULL] [UNIQUE] [DEFAULT default_value] [COMMENT col_comment]列注释 根据方言不同
- 默认 脱离添加列语句, 单独使用
COMMENT ON COLUMN table_name.column IS column_comment MySQL,MariaDB直接在添加列语句中
修改主键
分为org.huiche.ddl.statement.AddPrimaryKey和org.huiche.ddl.statement.DropPrimaryKey
如果数据库中存在主键且与java定义的不一致, 会先执行DropPrimaryKey 再执行AddPrimaryKey,否则单独执行DropPrimaryKey或AddPrimaryKey
删除主键
默认语法为
ALTER TABLE table_name DROP PRIMARY KEYPostgreSQL,SQLServer,DM达梦
ALTER TABLE table_name DROP CONSTRAINT index_name添加主键
ALTER TABLE table_name ADD PRIMARY KEY (pk1[,pk2]...)所有数据库使用语句一致
DB2,SQLServer 添加主键前要求列必须非空,所以可能在其前面执行 设置列为非空的语句
修改列
org.huiche.ddl.statement.ModifyColumn 默认内部实现为,自动判断拆分为各个子语句执行
AlterColumnType修改列类型AlterNullabe修改非空约束AddUnique,DropConstraint修改唯一AlterDefault修改默认值AlterColumnComment修改列注释
SQLServer 如果列类型修改或非空修改, 会一并执行AlterColumnType修改列类型,其他修改等同默认实现
MySQL,MariaDB 如果单独Unique修改会执行AddUnique或DropConstraint,单独修改默认值会执行AlterDefault,带有其他的修改会统一执行ModifyColumn
ALTER TABLE table_name MODIFY column_name type[(length,scale)] [auto_increment] [NOT_NULL] [UNIQUE] [DEFAULT default_value] [COMMENT col_comment]修改列类型
org.huiche.ddl.statement.AlterColumnType 默认语法为
ALTER TABLE table_name ALTER COLUMN column_name SET DATA TYPE type[(length,scale)]PostgreSQL
ALTER TABLE table_name ALTER COLUMN column_name SET DATA TYPE type[(length,scale)] USING column_name::type[(length,scale)]Oracle,DM达梦
ALTER TABLE table_name MODIFY column_name type[(length,scale)]SQLServer, 必须与非空约束一起设置
ALTER TABLE table_name ALTER COLUMN column_name type[(length,scale)] [NOT] NULL修改非空约束
org.huiche.ddl.statement.AlterNullabe 默认语句
ALTER TABLE table_name ALTER COLUMN column_name DROP NOT NULL
# 或
ALTER TABLE table_name ALTER COLUMN column_name SET NOT NULLOracle
ALTER TABLE table_name MODIFY column_name [NOT] NULLDM达梦
# 或
ALTER TABLE table_name ALTER COLUMN column_name SET [NOT] NULLSQLServer 不支持单独修改非空约束, 只能与列类型一起修改修改列类型
SQLite 不支持修改非空约束
修改唯一
分为org.huiche.ddl.statement.AddUnique和org.huiche.ddl.statement.DropConstraint
添加唯一
ALTER TABLE table_name ADD CONSTRAINT uk_column_name UNIQUE col_name;所有数据库使用语句一致
DB2 添加唯一前要求列必须非空,所以可能在其前面执行 设置列为非空的语句
删除唯一
默认语句为
ALTER TABLE table_name DROP CONSTRAINT unique_index_nameMySQL
ALTER TABLE table_name DROP INDEX unique_index_nameSQLite
DROP INDEX unique_index_name修改默认值
org.huiche.ddl.statement.AlterDefault 默认语法为
ALTER TABLE table_name ALTER column_name SET DEFAULT default_valueOracle
ALTER TABLE table_name MODIFY column_name DEFAULT default_valueSQLServer
ALTER TABLE table_name ADD DEFAULT default_value FOR column_nameSQLite 不支持修改默认值