自动标识引用
正如 SmartEDB 用户指南中所讨论的,可以为表定义一个自动 ID,以便在插入新行时自动生成一个唯一的数字。这种内部递增的数字在一些流行的数据库管理系统中被称为“自动递增”、“标识”或“序列”值。使用自动 ID 列并从相关对象引用该列,可以实现高效的对象引用。SmartESQL 通过在创建表时使用 autoid 和 reference 关键字来支持自动 ID(一个 8 字节的整数值)。例如:
create table Company (autoid reference, userid integer primary key,
name string);
create table Employee (userid integer primary key, name string,
company reference to Company);
请注意,引用字段的声明中必须同时包含 autoid 和 reference,并且必须位于表中所有其他字段之前。当执行插入语句时,会自动将一个唯一的值插入到引用字段中。autoid 计数器在整个数据库中是全局的,与表无关,因此单个表的实际 autoid 值不一定连续。并且在向具有 autoid 的表插入数据时,autoid 不包含在列列表中。例如:
insert into Company values (10, 'ACME Enterprises');
insert into Company values (20, 'Carrot Patch Inc.');
然后可以显示参考值:
select autoid, userid, name from Company;
autoid userid name
--------------------------------------------------------------------
1 10 ACME Enterprises
2 20 Carrot Patch Inc.
Selected records: 2
除了自动生成的引用值外,还会创建一个索引(哈希)以优化对引用字段的查找。然后可以将引用值插入到从属表中以创建外键引用:
insert into Employee values (101, 'Wylie Coyote', 1);
insert into Employee values (102, 'Road Runner', 1);
insert into Employee values (201, 'Elmer Fudd', 2);
insert into Employee values (202, 'Bugs Bunny', 2);
然后可以执行高效的查询来连接这两个表,从而利用引用哈希索引的优势。例如:
select c.name as “Company”, e.userid as “Employee: Id”,
e.name as “Name”
from Company c, Employee e
where c.userid = 10 and c.autoid = e.company;
Company Employee: Id Name
--------------------------------------------------------------------
ACME Enterprises 101 Wylie Coyote
ACME Enterprises 102 Road Runner
Selected records: 2
或
select c.name as “Company”, e.userid as “Employee: Id”,
e.name as “Name”
inner join Employee e on c.autoid = e.company
where c.userid` = 20;
Company Employee: Id Name
--------------------------------------------------------------------
Carrot Patch Inc. 201 Elmer Fudd
Carrot Patch Inc. 202 Bugs Bunny
Selected records: 2
由于引用字段的值是自动生成的,在插入相关记录时可能并不知道其值,如上述示例所示。为此提供了 get_last_autoid() 函数。可以按如下方式使用该函数来插入“所有者”和相关对象:
insert into Company values (10, 'ACME Enterprises');
insert into Employee values (101, 'Wylie Coyote', get_last_autoid());
insert into Employee values (102, 'Road Runner', get_last_autoid());
insert into Company values (20, 'Carrot Patch Inc.');
insert into Employee values (201, 'Elmer Fudd', get_last_autoid());
insert into Employee values (202, 'Bugs Bunny', get_last_autoid());
请注意,在插入“公司”对象时生成的“autoid”字段的值,会在随后插入的两个“员工”对象中通过 get_last_autoid() 函数获取。