创建表
使用 SQL 的“创建表”语句创建一个与 SmartEDB 类对应的 SQL 表,该语句需指定表名和列(字段)定义。例如:
create table t (x integer);
这里创建了一个名为 t 的表(类),其中包含一个名为 x 的整数类型列(字段)。 语法如下:
CREATE [temporary | local] TABLE name "(" { column_name data_type [ column constraint [ ... ] ] |
[ CONSTRAINT name ] table_constraint } [ "," ... ] ")"
[IF NOT EXISTS]
column_constraint:
[ NOT ] NULL | PRIMARY KEY | UNIQUE |
USING [ HASH | RTREE ] INDEX |
[ FOREGN KEY ] REFERENCES table_name [ "(" column_name [ "," ... ] ")"
table_constraint:
| UNIQUE "(" column_name [ "," ... ] ")"
| PRIMARY KEY "(" column_name [ "," ... ] ")"
| FOREIGN KEY REFERENCES table_name "(" column_name [ "," ... ] ")"
data_type:
BIT | BOOLEAN | CHAR [ "(" size ")" ] | VARCHAR [ "(" size ")" ] | LOGNVARCHAR [ "(" size ")" ] |
STRING [ (" width ")" ] | UNICODE[ (" width ")" ] -- corresponds to SmartEDB nstring or nchar
| TINYINT -- signed<1>
| SMALLINT -- signed<2>
| INT [ "(" n ")" ] -- where n=1,2,4,8 corresponds to SmartEDB signed<n>
| INTEGER [ "(" n ")" ] -- where n=1,2,4,8 corresponds to SmartEDB signed<n>
| UNSIGNED [ "(" n ")" ] -- where n=1,2,4,8 corresponds to SmartEDB unsigned<n>
| BIGINT -- signed<8>
| FLOAT
| REAL -- double
| DOUBLE
| NUMERIC [ "(" width [ "," precision ] ")" ] -- SmartEDB numeric< width,precision> type
| DECIMAL [ "(" width [ "," precision ] ")" ] -- SmartEDB numeric< width,precision> type
| DATE -- SmartEDB 8-byte datetime type
| TIME -- SmartEDB 8-byte datetime type
| TIMESTAMP -- SmartEDB 8-byte datetime type
| BIANRY [ "(" size ")" ] --- array or vector of signed<1>
| VARBINARY [ "(" size ")" ] --- array or vector of signed<1>
| LONGVARBINARY [ "(" size ")" ] --- array or vector of signed<1>
| REFERENCE
| BLOB
| ARRAY "(" data_type [ "," length ] ")"
| SEQUENCE "(" scalar_data_type [ ASC | DESC ] ")"
| user-defined-type -- declared by "create domain"
请注意,在 SmartESQL 中,所有 SQL 关键字均不区分大小写——即“CREATE TABLE”和“create table”是等效的。
可选关键字“临时”可用于创建临时表或虚拟表。有关更多详细信息,请参阅 SmartESQL 虚拟表页面。
在创建表时,还需要在数据库头中为字典和新创建的表预留空间。如果使用 C/C++ API,则通过在传递给 mco_db_open_dev() 的 mco_db_params_t 结构中指定 ddl_dict_size、max_classes 和 max_indexes 来实现。例如:
db_params.ddl_dict_size = 16*1024;
db_params.max_classes = 100;
db_params.max_indexes = 100;
如果使用 xSQL,这些参数可以通过配置文件参数进行设置:
db_params:
{
ddl_dict_size: 16K,
max_classes : 100,
max_indexes : 100,
}
本地表
本地限定符用于指定 SmartEDB 高可用性部分复制的表。可以将表声明为在主数据库或副本数据库中为本地表,以防止这些表中的数据在网络中进行复制。
If Not Exists
if not exists 子句可用于在表已存在时覆盖错误。
例如,请注意以下 create table 语句失败,而添加 if not exists 子句则可使执行成功:
XSQL>create table foo(x integer);
XSQL>create table foo(x integer, y integer);
ERROR: Table already exists
XSQL>create table if not exists foo(x integer, y integer);
XSQL>insert into foo values (1);
XSQL>select * from foo;
x
------------------------------------------------------------------------------
1
Selected records: 1
约束解释
约束可以针对整个表指定,也可以针对单个列指定。如果显式为表约束指定了名称(使用 CONSTRAINT name 子句),则该名称将用作索引名称。否则,将使用第一个约束字段的名称作为索引名称。
如果未通过约束指定索引,则会为此类隐式创建一个列表索引(实际上是哈希)。
[Not] Null
对于列的空值约束情况,SmartEDB 字段会被标记为可为空(会为此字段明确创建一个空值指示器)。
请注意:
- 此命令的作用范围是连接(SQL 会话)
- 可空字段会增加存储开销;每个字段占用一个字节。可空字段无法建立索引,这会极大地影响性能,因为索引优化将无法实现。例如,对于此默认策略以及以下 CREATE TABLE 语句:
create table foo(x integer using index);
索引将不会被用于执行:
select * from foo order by x;
- 此默认策略允许第三方工具通过 JDBC 和 ODBC 连接到 SmartESQL 数据库,因为这些工具依赖于指定的 SQL 标准来访问数据库。
唯一键和主键
对于 UNIQUE 和 PRIMARY KEY,会创建一个唯一索引。USING [HASH] INDEX 和 FOREIGN KEY 约束会导致创建一个非唯一索引。列约束 USING INDEX 可以与 UNIQUE 结合使用,在这种情况下,索引也将被声明为唯一。
对于“使用哈希索引”约束的情况,会采用 SmartEDB 哈希表索引,否则会采用 B 树索引。哈希表的初始大小设定为 100000(如果表中的记录数超过此值,此哈希表将动态重新分配)。
可变大小类型与固定大小类型
CHAR(N) 规范映射到 SmartEDB 固定长度字符数组类型(char<N> 或 nchar<N>)。VARCHAR、LONGVARCHAR、STRING 或 UNICODE 类型映射到 SmartEDB 的 string 或 nstring 类型;如果后面跟有大小规范,则忽略该大小规范。
BINARY(N) 规范映射到固定大小的二进制 SmartEDB 类型(binary<n>)。VARBINARY 或 LONGVARBINARY 类型映射到 SmartEDB 可变大小的二进制类型(varbinary);如果后面跟有大小规范,则忽略该大小规范。请注意,与 CHAR(N) 和 VARCHAR 类型不同,BINARY(N) 和 VARBINARY 类型不会以零填充,并且不会将空字符(\0)解释为字符串终止符。
有关 SmartEDB 数据类型的定义,请参阅基本数据类型页面。
用户定义类型
SmartESQL 支持“创建域”语句。域可用作会话级类型别名。但请注意,SmartEDB 不会保存域定义(即会话终止后,域定义将丢失)。
语法非常简单:
CREATE DOMAIN name type;
其中 type 是任何有效的类型定义,例如 char(10) 。