oracle - 通过 slick 处理 Oracle 中的自动 inc 列

标签 oracle scala auto-increment slick sequence-sql

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

    CREATE TABLE USER
    (    "USER_ID" NUMBER NOT NULL ENABLE,
         "NAME" VARCHAR2(100) NOT NULL ENABLE,
         "ADDRESS" VARCHAR2(1000) NOT NULL ENABLE
    );
    CREATE SEQUENCE USER_ID_SEQ  MINVALUE 1 MAXVALUE 99999999999999 INCREMENT BY 2;

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

最佳答案

以下是 Typesafe 开发人员建议的一些选项:

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

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

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

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

关于oracle - 通过 slick 处理 Oracle 中的自动 inc 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26769370/

相关文章:

php - 带日期前缀的唯一标识符混合格式 (Php/MySQL)

mysql - sql连接同一个表中的2行

scala - 如何在 Play 2.0.1 中使用 TestServer 运行多个功能规范?

scala - 如何将Spark DataFrame插入Hive内表?

sql - PostgreSQL 中的相关 SERIAL 列

php - 单击提交按钮时如何增加值

Oracle访问多个数据库

sql - 如何在oracle数据库中输入 "&"这样的特殊字符?

java - 我查询获取列默认值但出现 ORA-17003

scala - Scala 中的选项 monad