2

我正在使用光滑的 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[]。

4

1 回答 1

4

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

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

    创建序列 $seq 以 1 递增 1 开始;
    在插入 $tab 之前创建或替换触发器 $trg,当(new.$col 为空)开始时,每行引用 new 作为新的 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),但您可以轻松地使用映射对象并预编译所有内容。

于 2014-12-07T19:41:43.873 回答