2017-02-21 15 views
2

Я две таблицы объявлены следующим образом:LiquiBase - вставка строки с UUID

<changeSet author="istvan" id="country-table-changelog"> 
    <createTable tableName="country"> 
     <column name="id" type="uuid"> 
      <constraints nullable="false" unique="true" /> 
     </column> 
     <column name="name" type="varchar"> 
      <constraints nullable="false" unique="true" /> 
     </column> 
    </createTable> 
</changeSet> 

<changeSet author="istvan" id="region-table-changelog"> 
    <createTable tableName="region"> 
     <column name="id" type="uuid" > 
      <constraints nullable="false" unique="true" /> 
     </column> 
     <column name="country_id" type="uuid"> 
      <constraints nullable="false" /> 
     </column> 
     <column name="name" type="varchar"> 
      <constraints nullable="false" unique="true" /> 
     </column> 
    </createTable> 
</changeSet> 

<changeSet author="istvan" id="region-country-foreign-key-constraint"> 
    <addForeignKeyConstraint 
     baseTableName="region" 
     baseColumnNames="country_id" 
     referencedTableName="country" 
     referencedColumnNames="id" 
     constraintName="fk_region_country" 
     onDelete="CASCADE" 
     onUpdate="RESTRICT"/> 
</changeSet> 

Я хочу, чтобы заполнить обе таблицы из LiquiBase журнала изменений файла с некоторыми значениями, как:

INSERT INTO country VALUES('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 'HUNGARY'); 
INSERT INTO region VALUES('bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 'Baranya'); 

В примере I использовал aaaa и bbbb только из-за простоты. Я хочу сгенерировать эти UUID с помощью СУБД.

Каков наилучший способ сделать это? Должен ли я использовать SQL в моих файлах изменений или это возможно с XML? Я предпочитаю независимое от СУБД решение, такое как XML или JSON.

Мой второй вопрос заключается в том, как я могу объявить столбец с UUID, который создает UUID для вставки. Что-то вроде:

<column name="id" type="uuid" value="??? GENERATE UUID ???"> 
    <constraints nullable="false" unique="true" /> 
</column> 

Благодарим вас за внимание!

ответ

0

Некоторые базы данных поддерживает UUID столбцы: Generate UUID values by default for each row on column of UUID type in H2 Database Engine

Я не думаю, что LiquiBase имеет встроенный генератор UUID, имеют вид на defaultValueComputed/valueComputed собственности на колонке (http://www.liquibase.org/documentation/column.html) + функции DB для генерации UUID

6

Вы можете сделать это в a, используя свойства, которые определены в зависимости от текущей СУБД.

<property name="uuid_type" value="uuid" dbms="postgresql"/> 
<property name="uuid_type" value="uniqueidentifier" dbms="mssql"/> 
<property name="uuid_type" value="RAW(32)" dbms="oracle"/> 

<property name="uuid_function" value="uid.uuid_generate_v4()" dbms="postgresql"/> 
<property name="uuid_function" value="NEWID()" dbms="mssql"/> 
<property name="uuid_function" value="sys_guid()" dbms="oracle"/> 

Затем использовать эти свойства при определении таблицы:

<column name="id" type="${uuid_type}" defaultValueComputed="${uuid_function}"> 
    <constraints nullable="false" unique="true" /> 
</column> 

Обратите внимание, что вам нужно использовать defaultValueComputed, неvalue

Если столбец определяется значением по умолчанию, просто оставьте это в ваших инструкциях вставки, и тогда база данных будет генерировать UUID при вставке.

+0

Первая часть работает. Он вставляет Венгрию с идентификатором '919d39e4-2387-4926-91d5-595ebe0eea07'. Однако для второй вставки это дает следующее исключение: «ОШИБКА: вставка или обновление в таблице« область »нарушает ограничение внешнего ключа« fk_region_country »Ключ (country_id) = (34e4e0d8-91d8-4d52-99ae-ec42d6b0e66e) отсутствует в таблица «страна». Использование внешнего ключа ясен, но я не знаю, как работать с ним в ликбазе. Вот код я использую: \t '<имя столбца = типа "country_id"= "$ {uuid_type}" defaultValueComputed = "$ {uuid_function}"> \t \t \t <ограничения обнуляемым = "ложь"/> \t \t \t 'Thx –

+0

@ FarkasIstván - Я получаю ту же ошибку. Надеюсь, я скоро найду ответ, но пока, если вы это выяснили, сообщите мне. – degreesightdc

 Смежные вопросы

  • Нет связанных вопросов^_^