【发布时间】:2019-12-19 10:42:19
【问题描述】:
我想在 QLDB 中创建一个唯一字段。我尝试使用UNIQUE,但得到:
unexpected token found, KEYWORD : unique; Unexpected token following CREATE
【问题讨论】:
标签: amazon-qldb partiql
我想在 QLDB 中创建一个唯一字段。我尝试使用UNIQUE,但得到:
unexpected token found, KEYWORD : unique; Unexpected token following CREATE
【问题讨论】:
标签: amazon-qldb partiql
Amazon QLDB 不支持所有 PartiQL 操作。
CREATE TABLE 参考文档说,
QLDB 支持开放内容并且不强制执行架构,因此您在创建表时无需定义属性或数据类型。 [强调我的]
因此,合乎逻辑的结论是 QLDB 不支持对您在表中定义的任何字段的UNIQUE 约束。
QLDB 确认了这一点tutorial
INSERT 语句创建版本号为零的文档的初始修订。为了唯一标识每个文档,QLDB 会分配一个文档 ID 作为元数据的一部分。
重要
由于 QLDB 不强制执行架构,您可以将同一个文档多次插入到表中。每个插入语句都向日志提交一个单独的文档条目,并且 QLDB 为每个文档分配一个唯一的 ID。
QLDB 保证唯一的唯一字段是 documentId。
编辑:
您可以强制应用程序的唯一性。方法如下:
SELECT id FROM myTable By id WHERE myUniqueField = ?
myUniqueField 值的记录
您只能在空表上创建索引,因此您可能应该抢先为该字段创建索引,而不是等到出现性能问题,因为 QLDB 正在执行全表扫描。
编辑:
截至 2020 年 9 月 30 日,QLDB 支持向非空表添加索引。
【讨论】:
根据 Matthew Pope 的回答,QLDB 目前不支持架构或唯一索引。
也就是说,在您的应用程序中实现此行为非常容易:
SELECT id FROM foo BY id WHERE attr = ? -- [1]
INSERT INTO foo ? -- [2]
在您的应用程序中,您应该断言 SELECT 查询 (1) 没有找到任何结果,并且只有在该断言通过后才运行 INSERT 语句 (2)。
如果竞争事务同时通过断言 (1),则只有一个事务将提交。 OCC 下的其他事务将失败。
正如所写,上面是唯一的属性,而不是唯一的索引。出于性能原因,您可能会desire the attribute be indexed 使得 SELECT 查询 (1) 不执行表扫描。
CREATE INDEX ON foo (attr)
【讨论】:
select 和 insert 必须在单独的调用中发生。)您是否有任何文档表明 QLDB 支持此类多调用事务?我的印象是它没有。