金仓数据库KingbaseES 新兼容——Create table like 语法
1.产品新特性
Mysql中create table like 用于根据另一个已定义的表创建一个新的空表,新表上的所有列属性及索引与源表上一致,且新表上的存储方式与源表也保持一致。为了进一步提升兼容Mysql的能力以及产品水平,我们在KingbaseES产品设计中增加兼容Mysql的语法,提供create table like语句的功能。通过调研我们发现,Create table like仅适用于基本表,不适用于视图。在锁表语句生效时不能执行create table或create table like语句。源表是临时表,使用create table like创建的新表不是临时表,若期望新表也是临时表,请使用create temporary table like。
2.MySQL中的create table like
MySQL的 create table like 语法图:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
{ LIKE old_tbl_name | (LIKE old_tbl_name) }
经过调研我们发现,在锁表语句生效时不能执行create table或create table like语句;新表创建时的检查与源表创建时一样。使用create table like创建表,新表会保留源表的生成列信息、表达式默认值、check约束(除了生成的约束名)、表上的约束(除外键约束外)、表及列上的comment信息等,但不会保留源表的数据文件、索引文件及任意的外键约束;使用create table like创建表同样会将所有ENGINE_ATTRIBUTE 和SECONDARY_ENGINE_ATTRIBUTE的值添加到新表上。
在我们金仓数据库KingbaseES 产品中,对其进行语法层和功能层的兼容设计,目前已经实现MySQL的这一功能特性。
3.金仓数据库KingbaseES的实现方式
KES中的create table (like)用于将一个表上所有的列名、数据类型以及它们的非空约束复制到新表上,可指定“like_option“ 子句指定所要复制的原始表的附加属性。KES的语法格式:
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT
EXISTS ] table_name (
LIKE source_table [ like_option ... ]
)
[ INHERITS ( parent_table [, ... ] ) ]
[ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [
COLLATE collation ] [ opclass ] [, ... ] ) [ partition_extented_spec ] ]
[ USING method ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS | WITH ROWID]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ WITH ( ONCOMMIT = value ) ]
[ TABLESPACE tablespace_name ]
[ { ENABLE | DISABLE } [ VALIDATE | NOVALIDATE ] constraint [ ... ] ]
[ ENCRYPTED [BY tablekey ]]
like_option:
{ INCLUDING | EXCLUDING } { COMMENTS | CONSTRAINTS | DEFAULTS | GENERATED |IDENTITY | INDEXES | STATISTICS | STORAGE | ALL }
可用的选项有:
①INCLUDING COMMENTS 复制列、约束和索引的注释将被复制。默认行为是排除注释,新表中复制的列和约束没有注释。
②INCLUDING CONSTRAINTS CHECK 约束将被复制。列约束和表约束之间没有区别。非空约束总是复制到新表中。
③INCLUDING DEFAULTS 复制列定义的默认表达式将被复制。否则,将不复制默认表达式,从而导致新表中复制的列具有空默认值。注意,复制调用数据库修改函数 (如 nextval) 的默认值可能会在原始表和新表之间创建功能链接。
④INCLUDING GENERATED 复制列定义的任何生成表达式都将被复制。默认情况下,新列将是常规的基本列。
⑤INCLUDING IDENTITY 复制列定义的任何标识规范都将被复制。为新表的每个标识列创建一个新序列,与旧表关联的序列分离。
⑥INCLUDING INDEXES 原始表上的 Indexes、PRIMARY KEY、UNIQUE、和 EXCLUDE 约束将在新表上创建。新索引和约束的名称是根据默认规则选择的,而不管原始索引和约束是如何命名的。(这种行为可以避免新索引可能出现的重复命名错误。)
⑦INCLUDING STATISTICS 扩展的统计信息被复制到新表中。
⑧INCLUDING STORAGE将复制复制列定义的设置。默认行为是排除 STORAGE 设置,使得新表中复制的列具有类型特定的默认设置。
⑨INCLUDING ALL是选择所有可用的单独选项的缩写形式。(在 INCLUDING ALL 之后选择除某些特定选项外的所有选项,编写单独的 EXCLUDING 子句是有用的。)
此外,LIKE 子句也能被用来从视图、外部表或组合类型拷贝列定义。不适合的选项(例如来自视图的INCLUDING INDEXES)会被忽略。
语法示例:
test=# create temp table t(a int,b char);
CREATE TABLE
test=# \d+ t
Table "pg_temp_4.t"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
--------+-------------------+-----------+----------+---------+----------+--------------+-------------
a | integer | | | | plain | |``
b | character(1 char) | | | | extended | |
Access method: heap
test=# create temp table t2 (like t);
CREATE TABLE
test=# \d+ t2
Table "pg_temp_4.t2"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
--------+-------------------+-----------+----------+---------+----------+--------------+-------------
a | integer | | | | plain | |
b | character(1 char) | | | | extended | |
Access method: heap
这极大丰富了KingbaseES 的语法,使得产品功能更加完善。金仓数据库将始终坚持创新,提升产品质量,引领国产数据库越好又快向前发展,努力成为世界卓越的数据库产品与服务提供商。




