CREATE TABLE
功能描述
Vastbase G100在MySQL兼容模式下,使用CREATE TABLE语法时支持以下特性:
支持指定AUTO_INCREMENT属性,用于生成自增列。
支持在建表时指定存储引擎和字符集。
支持在建表时指定表级校对规则。
支持在建表时定义表的注释内容。
支持在建表时使用列约束ON UPDATE特性,该特性用于:执行UPDATE操作TIMESTAMP字段为缺省时,则自动更新TIMESTAMP字段的时间戳。如果更新字段的数据内容与原来的数据内容一致,则其他含有ON UPDATE字段的时间戳不会自动更新。
当INSERT数据时,如果该字段没有指定数值,则当前的TIMESTAMP将作为字段的缺省值插入。
当表中对应的行记录被UPDATE时,该字段会自动更新为CURRENT_TIMESTAMP时间戳。
本文档仅列出CREATE TABLE在MySQL兼容模式下的特性用法,更多语法及参数说明详见SQL语法参考中的CREATE TABLE。
注意事项
以上功能仅在数据库兼容模式为MySQL时能够使用(即创建DB时DBCOMPATIBILITY='B'),在其他数据库兼容模式下不能使用上述特性。
支持在建表时指定存储引擎和字符集的功能只做纯语法兼容,不实现功能。
使用AUTO_INCREMENT(自增列)语法时需注意:
一张表只允许存在一个AUTO_INCREMENT字段。
AUTO_INCREMENT字段必须是主键字段或联合主键字段之一。对表插入数据时,若指定了AUTO_INCREMENT字段的值,且该值大于表中该自增列的最大值时,需要更新自增列的下一个值为当前插入数据值加1。
支持在含有自增列的表中INSERT多行数据;自增列可以插入负值或更新负值。
对表插入数据时,若指定AUTO_INCREMENT字段为NULL或0,则依旧触发自增机制。
在MySQL兼容模式下,serial类型字段与AUTO_INCREMENT类型字段特性一致。
自增列的值被更新后无法回退,即使其所在的事务后续回滚依旧如此。多个session并发插入时应保证可用性,需要慎重考虑插入操作导致自增值更新所带来的后果。
语法格式
CREATE TABLE table_name
( { column_name data_type [ column_constraint [ ... ] ]})
[ AUTO_INCREMENT [ = ] value ]
[ COLLATE [=] collate_name]
[ ENGINE [=] engine_name ]
[ COMMENT {=|} 'text' ]
[ { CHARSET | CHARACTER SET } [=] charset_name ];
其中列约束column_constraint可以是:
where column_constraint can be:
[ CONSTRAINT [ constraint_name ] ]
{ ON UPDATE update_expr | AUTO_INCREMENT }
参数说明
table_name
要创建的表名。
column_name
新表中要创建的字段名。
data_type
字段的数据类型。
若指定自增列属性,数据类型仅支持整数类型、4字节或8字节浮点类型。
[ CONSTRAINT [ constraint_name ] ]
列约束。可选的约束子句用于声明约束,新行或者更新的行必须满足这些约束才能成功插入或更新。列约束作为一个列中定义的一部分,仅影响该列。
ON UPDATE update_expr
对于字段数据类型TIMESTAMP来说,update_expr使用CURRENT_TIMESTAMP作为缺省值。
AUTO_INCREMENT
该关键字将字段指定为自增列。
若在插入时不指定此列的值(或指定此列的值为0、NULL、DEFAULT),此列的值将由自增计数器自动增长得到。
若插入或更新此列为一个大于当前自增计数器的值,执行成功后,自增计数器将刷新为此值。
自增初始值由
AUTO_INCREMENT [ = ] value
子句设置,若不设置,默认为1。collate_name
表的校对规则。可用的规则可以在系统表PG_COLLATION中查询,默认的排序规则为查询结果中以default开始的行。
ENGINE [=] engine_name
该参数用于指定存储引擎。
COMMENT {=|} 'text'
为创建的表指定注释内容。“=”可省略。
{ CHARSET | CHARACTER SET } [=] charset_name
该参数用于选择表所使用的字符集。
示例
前置步骤: 创建兼容模式为MySQL的库db_mysql,并进入。
create database db_mysql dbcompatibility='B';
\c db_mysql;
示例1: 在建表时指定表级校对规则。
1、查看数据库的pad_attribute参数。
show pad_attribute;
返回结果为:
pad_attribute
---------------
NO PAD
(1 row)
Vastbase G100支持初始化数据库时指定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)
示例2: 在建表时指定存储引擎和字符集。
1、创建一张测试表并设置ENGINE和CHARSET。
create table tab_1131500 (id int, val1 int, val2 text) ENGINE=InnoDB 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)
示例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: 创建表时定义注释COMMENT。
1、创建测试表,并为测试表增加comment。
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: 在建表时指定ON UPDATE属性。
1、创建测试表并插入数据。表中使用CREATE_TIME和UPDATE_TIME字段记录表的创建时间和字段的更新时间。
create table test (
ID bigint NOT NULL,
CID bigint,
CREATE_TIME timestamp NULL DEFAULT CURRENT_TIMESTAMP,
UPDATE_TIME timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (ID) );
2、向表中插入一条数据。
insert into test(id, cid) values(1001, 1001);
3、查看测试表当前数据。
select * from test;
返回结果如下,INSERT时没有为CREATE_TIME和UPDATE_TIME字段指定数值,所以当前的TIMESTAMP作为数值被插入。
ID | CID | CREATE_TIME | UPDATE_TIME
------+------+----------------------------+----------------------------
1001 | 1001 | 2023-05-28 00:24:09.530599 | 2023-05-28 00:24:09.530599
(1 row)
4、再次插入一条数据。
insert into test(id, cid) values(1002, 1002);
5、查看此时测试表内容。
select * from test;
返回结果如下:
ID | CID | CREATE_TIME | UPDATE_TIME
------+------+----------------------------+----------------------------
1001 | 1001 | 2023-05-28 00:24:09.530599 | 2023-05-28 00:24:09.530599
1002 | 1002 | 2023-05-28 00:24:28.103519 | 2023-05-28 00:24:28.103519
(2 rows)
6、更新表中的记录,对于id为1002的记录,将cid改为1003。
update test set cid=1003 where id=1002;
7、查看测试表数据。
select * from test;
返回结果如下,执行UPDATE操作后,对应记录的UPDATE_TIME字段已经更新为执行UPDATE操作的时间戳。
ID | CID | CREATE_TIME | UPDATE_TIME
------+------+----------------------------+----------------------------
1001 | 1001 | 2023-05-28 00:24:09.530599 | 2023-05-28 00:24:09.530599
1002 | 1003 | 2023-05-28 00:24:28.103519 | 2023-05-28 00:24:50.624596
(2 rows)