VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

CREATE TABLE

功能描述

Vastbase在MySQL兼容模式下,支持CREATE TABLE创建表时使用以下特性用法:

  • 支持指定AUTO_INCREMENT属性,用于生成自增列。

  • 支持创建表的同时定义表的注释内容。

  • 支持在建表时指定表级校对规则。

  • 支持在建表时指定字符集。

    建表时指定字符集功能仅为语法兼容,不实现其功能。

  • 支持在建表时使用列约束ON UPDATE特性,该特性用于:执行UPDATE操作TIMESTAMP字段为缺省时,则自动更新TIMESTAMP字段的时间戳。如果更新字段的数据内容与原来的数据内容一致,则其他含有ON UPDATE字段的时间戳不会自动更新。

    • 当INSERT数据时,如果该字段没有指定数值,则当前的TIMESTAMP将作为字段的缺省值插入。

    • 当表中对应的行记录被UPDATE时,该字段会自动更新为CURRENT_TIMESTAMP时间戳。

  • 支持在创建表时增加对列的注释,可在\d+查看表结构时查看列注释。

  • 支持在创建主键时指定USING BTREE。

    建表时指定USING BTREE仅为语法兼容,不实现其功能,当USING后跟BTREE以外的选项时将报错。

  • 支持在创建表时指定ENGINE。

    建表时指定ENGINE仅为语法兼容,不实现其功能。

注意事项

  • 上述功能仅在数据库兼容模式为MySQL时能够使用(即创建DB时DBCOMPATIBILITY='B'),在其他数据库兼容模式下不能使用以上特性。

  • ON UPDATE特性支持版本:V2.2 Build 10(Patch No.7)及以上补丁版本。需注意V2.2 Build 10(Patch No.12)及之前版本不支持ALTER TABLE场景下ON UPDATE与MODIFY DEFAULT连用。

  • 建表时指定表级校对规则特性支持版本:V2.2 Build 10(Patch No.8)及以上补丁版本。

  • 建表时添加注释特性支持版本:V2.2 Build 10(Patch No.10)及以上补丁版本。

  • 建表时指定字符集支持版本:V2.2 Build 10(Patch No.11)及以上补丁版本。

  • 建表时增加对列的注释、创建主键时指定USING BTREE、指定ENGINE支持版本:V2.2 Build 10(Patch No.17)及以上补丁版本。

  • 使用AUTO_INCREMENT(自增列)语法时需注意:

    • 一张表只允许存在一个AUTO_INCREMENT字段。

    • AUTO_INCREMENT字段必须是主键字段或联合主键字段之一。对表插入数据时,若指定了AUTO_INCREMENT字段的值,且该值大于表中该自增列的最大值时,需要更新自增列的下一个值为当前插入数据值加1。

    • 自增列可以插入负值或更新负值。

    • Vastbase G100 V2.2 Build 10在含有自增列的表中仅支持INSERT单行数据,暂不支持INSERT多行和INSERT…SELECT。Vastbase G100 V2.2 Build 11及之后版本在含有自增列表中支持INSERT多行数据。

    • 对表插入数据时,若指定AUTO_INCREMENT字段为NULL或0,则依旧触发自增机制。

    • 在MySQL兼容模式下,serial类型字段与AUTO_INCREMENT类型字段特性一致。

    • 自增列的值被更新后无法回退,即使其所在的事务后续回滚依旧如此。多个session并发插入时应保证可用性,需要慎重考虑插入操作导致自增值更新所带来的后果。

语法格式

CREATE TABLE [ IF NOT EXISTS ] table_name
  ( { column_name data_type [ column_constraint [ ... ] ][ COMMENT 'text' [...] ]
    | table_constraint
    ...
    [ AUTO_INCREMENT [ = ] value ]
    [ COMMENT {=|} 'text' ]
    [ COLLATE [=] collate_name]
    [ [DEFAULT] CHARACTER SET | CHARSET [ = ] default_charset ];
    [ ENGINE {=|} engine_name ]

其中表约束table_constraint为:

[ CONSTRAINT constraint_name ]
{ 
PRIMARY KEY ( column_name [, ... ] ) index_parameters [USING BTREE]|
...
]

参数说明

本文档仅列出CREATE TABLE在MySQL兼容模式下的特性用法,更多语法及参数说明详见SQL语法参考中的CREATE TABLE

  • [ IF NOT EXISTS ]

    如果已经存在相同名称的表,不会报出错误,而会发出通知,告知通知此表已存在。

  • table_name

    要创建的表名。

  • column_name

    新表中要创建的字段名。

  • data_type

    字段的数据类型。

  • column_constraint、table_constraint

    列约束以及表约束的内容。

  • AUTO_INCREMENT

    该关键字将字段指定为自增列。

    若在插入时不指定此列的值(或指定此列的值为0、NULL、DEFAULT),此列的值将由自增计数器自动增长得到。

    若插入或更新此列为一个大于当前自增计数器的值,执行成功后,自增计数器将刷新为此值。

    自增初始值由AUTO_INCREMENT [ = ] value子句设置,若不设置,默认为1。

    插入数据报错会记入自增计数器计数。

  • 'text'

    为创建的表或列指定的注释内容。

  • collate_name

    表的校对规则。可用的规则可以在系统表PG_COLLATION中查询,默认的排序规则为查询结果中以default开始的行。

  • charset_name

    用于选择表所使用的字符集。

  • engine_name

    用于指定表的存储引擎,目前仅语法兼容,无实际作用。

示例

前置条件 创建兼容MySQL的库db_mysql,并进入。

CREATE DATABASE db_mysql dbcompatibility='B';
\c db_mysql

示例1: 创建表时定义注释COMMENT。

1、创建测试表,并为测试表添加注释。

CREATE TABLE mytab(id int,col text) COMMENT = '测试ABC123!@#¥';

2、查询表oid。

select oid from pg_class where relname='mytab';

查询结果为如下:

  oid
-------
 18937
(1 row)

3、根据上一步查询到的oid查看表的注释。

select obj_Description( 18937,'pg_class');

查询结果为如下:

 obj_description
------------------
 测试ABC123!@#¥
(1 row)

obj_Description函数为系统函数,用于获取一个数据库对象的注释。

5、删除测试表。

DROP TABLE mytab;

示例2: 创建表时指定字符集。

1、创建一张测试表并为其设置CHARSET。

create table tab_1131500 (id int, val1 int, val2 text) DEFAULT CHARSET=utf8;

2、向表中插入数据。

insert into tab_1131500 values(1,1,1);

3、更新表中数据。

update tab_1131500 set id =2 where id =1;

4、查询数据。

select * from tab_1131500;

返回结果为:

 id | val1 | val2
----+------+------
  2 |    1 | 1
(1 row)

5、删除测试表。

DROP TABLE tab_1131500;

示例3: 在建表时将字段指定为自增列。

1、创建带有auto_increment字段的表,指定主键。

create table test1(a int primary key auto_increment, b int);

2、插入数据进行测试。

insert into test1(b) values(1);
insert into test1(b) values(1);
insert into test1 values(0,3);   --自增
insert into test1 values(NULL,4);  --自增
insert into test1 values(10000,5);  --此处改变自增列的下一个值为10001
insert into test1(b) values(6);
insert into test1 values(10,7);  --此处由于10较小,不改变序列下一个值
insert into test1(b) values(8);

3、查询结果。

select * from test1;

返回结果如下:

   a   | b
-------+---
     1 | 1
     2 | 1
     3 | 3
     4 | 4
 10000 | 5
 10001 | 6
    10 | 7
 10002 | 8
(8 rows)

4、删除测试表。

DROP TABLE test1;

示例4: 在建表时指定表级校对规则。

1、查看数据库的pad_attribute参数。

show pad_attribute;

返回结果为:

 pad_attribute
---------------
 NO PAD
(1 row)

Vastbase G100从V2.2 Build 10(Patch No.8)开始支持初始化数据库时指定pad_attribute以及创建数据库时指定pad_attribute的功能,以此来为新数据库设置默认的列校验属性,可选取值包括:

  • N,NO PAD:默认值。把字符串尾端的空格当作一个字符处理,即字符串等值比较不忽略尾端空格。

  • S,PAD SPACE:字符串等值比较忽略尾端空格。

2、创建具有各种字符串类型的测试表,并为每一列指定不同的列校对规则,指定表级别COLLATE为”C”。

其中列c2、c4、c6的校对规则为*-space,即忽略空格匹配。c7未指定列校对规则,使用建库时的默认校对规则,本示例建库时未指定,默认为NO PAD。

create table tb_1132414_01(
c1 text COLLATE "C",
c2 character varying(30) COLLATE "C-space",
c3 varchar(30) COLLATE "zh_CN",
c4 varchar2(30) COLLATE "zh_CN-space",
c5 nvarchar2(30) COLLATE "en_US",
c6 clob COLLATE "en_US-space",
c7 varchar(30)) COLLATE "C";

3、插入测试数据。(第一次插入的字符串尾端无空格,第二次插入的字符串尾端存在空格。)

insert into tb_1132414_01 values('qqq', 'cqvjj11', 'h2vu2hb3t', 'f4rh535', 'fr2h5fj3c', 'r2hfhcg', 'r2cgcr');
insert into tb_1132414_01 values('qqq ', 'cqvjj11 ', 'h2vu2hb3t ', 'f4rh535 ', 'fr2h5fj3c ', 'r2hfhcg ', 'r2cgcr ');

4、查看是否正确识别空格。

select c1='qqq', c2='cqvjj11', c3='h2vu2hb3t', c4='f4rh535', c5='fr2h5fj3c', c6='r2hfhcg', c7='r2cgcr' from tb_1132414_01;

返回结果如下:对于插入的第二条尾部带空格的数据,c2、c4、c6可以忽略空格,返回true,其它返回false。

 ?column? | ?column? | ?column? | ?column? | ?column? | ?column? | ?column?
----------+----------+----------+----------+----------+----------+----------
 t        | t        | t        | t        | t        | t        | t
 f        | t        | f        | t        | f        | t        | f
(2 rows)

5、删除测试表。

DROP TABLE tb_1132414_01;

示例5: 创建表时定义列注释COMMENT。

1、创建测试表,同时定义列的注释和存储引擎。

CREATE TABLE `table_1226548` (
  `groupLabel` varchar(32) NOT NULL COMMENT '分组标签',
  `objectId` varchar(32) NOT NULL COMMENT '关联Id',
  `objectName` varchar(255) NOT NULL COMMENT '关联表',
  `xtLrsj` datetime DEFAULT NULL COMMENT '最后修改时间',
  PRIMARY KEY (`groupLabel`,`objectId`,`objectName`) USING BTREE
) ENGINE=InnoDB  COMMENT='应用数据关联关系';

2、通过元命令查看表中列的注释。

\d+ table_1226548

返回结果为:

                                                         Table "public.table_1226548"
   Column   |              Type              |                 Modifiers                 | Storage  | Stats target | Descr
iption  |  Attalias
------------+--------------------------------+-------------------------------------------+----------+--------------+------
--------+------------
 grouplabel | varchar(32)                    | not null                                  | extended |              | 分组
签     | grouplabel
 objectid   | varchar(32)                    | not null                                  | extended |              | 关联I
d       | objectid
 objectname | varchar(255)                   | not null                                  | extended |              | 关联
       | objectname
 xtlrsj     | timestamp(0) without time zone | default NULL::timestamp without time zone | plain    |              | 最后
改时间 | xtlrsj
Indexes:
    "table_1226548_pkey" PRIMARY KEY, btree (grouplabel, objectid, objectname) TABLESPACE pg_default
Has OIDs: no
Options: orientation=row, compression=no, fillfactor=80

3、删除测试表。

DROP TABLE table_1226548;

清理环境

\c postgres
DROP DATABASE db_mysql;