Обработка столбцов auto inc в Oracle с помощью Slick
Я использую пятно 2.1.0. У Oracle нет понятия автоматического приращения для столбца, так как я могу управлять вставкой с помощью последовательности с помощью последовательности. например, у меня есть таблица и последовательность следующим образом:
СОЗДАТЬ ТАБЛИЦУ ПОЛЬЗОВАТЕЛЯ ( "USER_ID" NUMBER НЕ NULL ENABLE, "NAME" VARCHAR2(100) НЕ ОБУЧАЕТСЯ, "АДРЕС" VARCHAR2(1000) НЕ ОБУЧАЕТСЯ); CREATE SEQUENCE USER_ID_SEQ MINVALUE 1 MAXVALUE 99999999999999 INCREMENT BY 2;
Как я могу использовать эту последовательность для установки моего USER_ID?
Кроме того, установка autoIncLastAsOption = true в SourceCodeGenerator Slicks, похоже, не помогает. Мои идентификаторы все еще не являются опцией [].
1 ответ
Вот некоторые варианты, предлагаемые Typesafe Developer:
Если вы не против позволить Slick управлять DDL, вы можете использовать O.AutoInc с OracleDriver. Он автоматически создаст последовательность поддержки для сгенерированных значений идентичности. Это работает путем установки триггера, который автоматически заполняет идентификатор из последовательности. Вот код, который Slick генерирует для столбца AutoInc в Oracle:
создать последовательность $seq start с 1 приращением на 1;
создать или заменить триггер $trg перед вставкой на $tab, ссылаясь на новый как новый для каждой строки, когда (new.$col is null) начинает выбирать $seq.nextval into:new.$col from sys.dual;
конец;
где $seq, $trg, $col и $tab - это имена последовательности, триггера, столбца идентификаторов и таблицы.
Во время фактической операции вставки не выполняется специальный код. Поэтому, если у вас уже есть схема базы данных с последовательностью идентификаторов, вы можете вручную создать триггер, как показано выше, и пометить столбец как O.AutoInc в Slick, чтобы получить стандартную обработку для автоматически увеличивающихся столбцов.Если вы хотите решение без триггера, вы можете
insertExpr
для вставки в слик. Это позволяет вычислять выражения, например, используя собственный API последовательности Slick (который поддерживается OracleDriver), но в отличие от обычной вставки вы не получаете все функции, удобство и производительность (например, пакетные вставки и предварительно скомпилированные вставки). Недостатком является то, что это не может быть предварительно скомпилировано (но компиляция простого выражения из нескольких скалярных значений должна быть относительно дешевой), и вы не можете просто вставить отображаемый класс в таком случае без какой-либо дополнительной схемы отображения.Другой вариант - сначала получить новый идентификатор (или даже несколько идентификаторов для пакетной вставки) из последовательности одним запросом, поместить их в объекты передачи данных, а затем вставить их, как правило, с идентификаторами на месте. Для этого требуется один дополнительный запрос на пакет (для первой выборки идентификаторов), но вы можете легко использовать сопоставленные объекты и предварительно скомпилировать все.