【问题标题】:QLDB unique fieldQLDB 唯一字段
【发布时间】:2019-12-19 10:42:19
【问题描述】:

我想在 QLDB 中创建一个唯一字段。我尝试使用UNIQUE,但得到:

unexpected token found, KEYWORD : unique; Unexpected token following CREATE

【问题讨论】:

    标签: amazon-qldb partiql


    【解决方案1】:

    根据QLDB PartiQL Reference

    Amazon QLDB 不支持所有 PartiQL 操作。

    CREATE TABLE 参考文档说,

    QLDB 支持开放内容并且不强制执行架构,因此您在创建表时无需定义属性或数据类型。 [强调我的]

    因此,合乎逻辑的结论是 QLDB 不支持对您在表中定义的任何字段的UNIQUE 约束。

    QLDB 确认了这一点tutorial

    INSERT 语句创建版本号为零的文档的初始修订。为了唯一标识每个文档,QLDB 会分配一个文档 ID 作为元数据的一部分。

    重要

    由于 QLDB 不强制执行架构,您可以将同一个文档多次插入到表中。每个插入语句都向日志提交一个单独的文档条目,并且 QLDB 为每个文档分配一个唯一的 ID。

    QLDB 保证唯一的唯一字段是 documentId

    编辑:

    您可以强制应用程序的唯一性。方法如下:

    1. 开始交易
    2. 执行SELECT id FROM myTable By id WHERE myUniqueField = ?
    3. 确定是否已经存在对应myUniqueField 值的记录
    4. 插入新文档(如果值是唯一的)或返回现有文档(如果需要)
    5. 提交事务。 (从技术上讲,这可以与上一步合并。)

    您只能在空表上创建索引,因此您可能应该抢先为该字段创建索引,而不是等到出现性能问题,因为 QLDB 正在执行全表扫描。

    编辑:

    截至 2020 年 9 月 30 日,QLDB 支持向非空表添加索引。

    【讨论】:

    • 嗯...嗯,这有点不方便
    • 最终唯一是什么意思? QLDB 允许您实现完美的唯一性,请参阅我的答案。
    • 感谢您更新您的答案! :)
    【解决方案2】:

    根据 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)
    

    【讨论】:

    • 此解决方案要求单个事务可以包含对 QLDB 的多个调用。 (如果您要在应用程序中执行重复检查,selectinsert 必须在单独的调用中发生。)您是否有任何文档表明 QLDB 支持此类多调用事务?我的印象是它没有。
    猜你喜欢
    • 1970-01-01
    • 2011-02-19
    • 2015-06-16
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 2014-09-15
    相关资源
    最近更新 更多