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

人大金仓数据库KingbaseES 新兼容——Create table like 语法

数据猿 2023-08-18
477

金仓数据库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 的语法,使得产品功能更加完善。金仓数据库将始终坚持创新,提升产品质量,引领国产数据库越好又快向前发展,努力成为世界卓越的数据库产品与服务提供商。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论