【问题标题】:Handling auto inc columns in Oracle via slick通过 slick 在 Oracle 中处理 auto inc 列
【发布时间】:2015-01-02 08:43:15
【问题描述】:

我使用的是 slick 2.1.0。 Oracle 没有列的自动增量属性的概念,所以我如何使用序列通过 slick 管理插入。 例如我有一个表格和序列如下:

创建表用户 ( "USER_ID" NUMBER NOT NULL ENABLE, "NAME" VARCHAR2(100) NOT NULL ENABLE, “地址” VARCHAR2(1000) NOT NULL 启用 ); CREATE SEQUENCE USER_ID_SEQ MINVALUE 1 MAXVALUE 99999999999999 INCREMENT BY 2;

如何使用此序列来设置我的 USER_ID?
在 Slicks 的 SourceCodeGenerator 中设置 autoIncLastAsOption = true 似乎也无济于事。我的 ID 仍然不是 Option[]。

【问题讨论】:

    标签: oracle scala auto-increment slick sequence-sql


    【解决方案1】:

    以下是 Typesafe Developer 建议的一些选项:

    1. 如果您不介意让 Slick 管理 DDL,您可以将 O.AutoInc 与 OracleDriver 一起使用。它将自动为生成的标识值创建一个支持序列。其工作方式是安装一个触发器,该触发器会自动填充序列中的 ID。这是 Slick 为 Oracle 上的 AutoInc 列生成的代码:

      创建序列 $seq 以 1 递增 1 开始;
      在插入 $tab 之前创建或替换触发器 $trg,当(new.$col 为空)开始时,每行将新引用为新的 select $seq.nextval into :new.$col from sys.dual;
      结束;
      其中 $seq、$trg、$col 和 $tab 是序列、触发器、标识列和表的名称。
      在实际插入操作期间没有运行特殊代码。因此,如果您已经有一个带有标识序列的数据库模式,您可以手动创建一个如上所示的触发器,并在 Slick 中将该列标记为 O.AutoInc,以获得自动递增列的标准处理。

    2. 如果您想要一个没有触发器的解决方案,您可以 insertExpr 插入 Slick。这允许计算表达式,例如使用 Slick 自己的序列 API(由 OracleDriver 支持),但与普通插入不同,您无法获得所有功能、便利性和性能(例如批量插入和预编译插入)。 缺点是它不能被预编译(但是编译几个标量值的简单表达式应该相对便宜)并且你不能在没有一些额外的映射样板的情况下插入一个映射的 cased 类。

    3. 另一种选择是首先使用一个查询从序列中获取一个新的 id(或者甚至是批量插入的多个 id),将它们放入数据传输对象中,然后将它们通常与 id 插入地方。这需要每批次进行一次额外查询(用于第一次获取 id),但您可以轻松使用映射对象并预编译所有内容。

    【讨论】:

    • 嗨,我在哪里可以找到选项 2 的文档:使用 Slick 自己的序列 API?
    猜你喜欢
    • 2014-12-02
    • 2011-12-30
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多