2

私は滑らかな 2.1.0 を使用しています。Oracleには列の自動インクリメント属性の概念がないため、シーケンスを使用して滑らかに挿入を管理するにはどうすればよいですか。たとえば、次のようなテーブルとシーケンスがあります。

    テーブルユーザーの作成
    ( "USER_ID" NUMBER NOT NULL ENABLE,
         "NAME" VARCHAR2(100) NOT NULL ENABLE,
         "ADDRESS" 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 を管理させても構わない場合は、OracleDriver で O.AutoInc を使用できます。生成された ID 値のバッキング シーケンスが自動的に作成されます。これが機能する方法は、シーケンスから ID を自動的に入力するトリガーをインストールすることです。Slick が Oracle の AutoInc 列に対して生成するコードは次のとおりです。

    シーケンスを作成 $seq start with 1 increment by 1;
    $tab に挿入する前に、トリガー $trg を作成または置換します (new.$col が null の場合)、各行に対して new を参照し、sys.dual から :new.$col に $seq.nextval を選択します。
    終わり;
    ここで、$seq、$trg、$col、および $tab は、シーケンス、トリガー、ID 列、およびテーブルの名前です。
    実際の挿入操作中に実行される特別なコードはありません。したがって、ID シーケンスを持つデータベース スキーマが既にある場合は、上記のように手動でトリガーを作成し、Slick で列を O.AutoInc としてマークして、自動インクリメント列の標準処理を取得できます。

  2. insertExprトリガーのないソリューションが必要な場合は、Slick に挿入できます。これにより、Slick 独自のシーケンス API (OracleDriver でサポートされている) を使用するような計算式が可能になりますが、通常の挿入とは異なり、すべての機能、利便性、およびパフォーマンスが得られるわけではありません (バッチ挿入やプリコンパイル済み挿入など)。欠点は、これをプリコンパイルできないことです (ただし、いくつかのスカラー値の単純な式をコンパイルするのは比較的安価である必要があります)。また、マップされたケース クラスを、追加のマッピング ボイラープレートなしでそのまま挿入することはできません。

  3. もう 1 つのオプションは、最初に 1 つのクエリでシーケンスから新しい ID (またはバッチ挿入の場合は複数の ID) を取得し、それらをデータ転送オブジェクトに入れ、次に通常どおりに ID を挿入することです。これには、バッチごとに追加のクエリが 1 つ必要ですが (最初に ID をフェッチするため)、マップされたオブジェクトを簡単に使用してすべてをプリコンパイルできます。

于 2014-12-07T19:41:43.873 に答える