我想在 QLDB 中创建一个唯一字段。我尝试使用UNIQUE
,但得到:
unexpected token found, KEYWORD : unique; Unexpected token following CREATE
我想在 QLDB 中创建一个唯一字段。我尝试使用UNIQUE
,但得到:
unexpected token found, KEYWORD : unique; Unexpected token following CREATE
Amazon QLDB 不支持所有 PartiQL 操作。
CREATE TABLE
参考文档说,
QLDB 支持开放内容并且不强制执行 schema,因此您在创建表时无需定义属性或数据类型。[强调我的]
因此,合乎逻辑的结论是 QLDB 不支持UNIQUE
对您在表中定义的任何字段的约束。
QLDB教程证实了这一点
INSERT 语句创建版本号为零的文档的初始修订。为了唯一标识每个文档,QLDB 分配一个文档 ID 作为元数据的一部分。
重要的
因为 QLDB 不强制执行模式,所以您可以将同一个文档多次插入到表中。每个插入语句都向日志提交一个单独的文档条目,并且 QLDB 为每个文档分配一个唯一 ID。
QLDB保证唯一的唯一字段是documentId
.
编辑:
您可以强制应用程序的唯一性。就是这样:
SELECT id FROM myTable By id WHERE myUniqueField = ?
myUniqueField
您只能在空表上创建索引,因此您可能应该抢先为该字段创建索引,而不是等到出现性能问题,因为 QLDB 正在执行全表扫描。
编辑:
自 2020-09-30 起,QLDB 支持向非空表添加索引。
根据 Matthew Pope 的回答,QLDB 目前不支持模式或唯一索引。
也就是说,在您的应用程序中实现此行为非常容易:
SELECT id FROM foo BY id WHERE attr = ? -- [1]
INSERT INTO foo ? -- [2]
在您的应用程序中,您应该断言 SELECT 查询 (1) 没有找到任何结果,并且只有在断言通过后才运行 INSERT 语句 (2)。
如果竞争事务同时通过断言 (1),则只有一个事务将提交。在OCC下,另一笔交易将失败。
如所写,上面是唯一属性,而不是唯一索引。出于性能原因,您可能希望对属性进行索引,以使 SELECT 查询 (1) 不执行表扫描。
CREATE INDEX ON foo (attr)