Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как связать каждый id в bigint[id...id] с bigint id в Liquibase changelog xml

TremorI000 Профи (747), на голосовании 1 год назад
Я знаю про addForeignKey, но он не подходит для связывания разных типов.
Голосование за лучший ответ
Сергей Зорин Профи (979) 1 год назад
Для этого нужно использовать теги <sql> и <modifySql>.

Пример:

Теперь при применении этого changelog'a все id вида bigint[id...id] будут заменены на условия id >= x AND id <= y, где x и y - начальный и конечный id из диапазона.
TremorI000Профи (747) 1 год назад
понял, что нужно прописать sql запрос, но какой именно? CHECK?
TremorI000 Профи (747) TremorI000, вот у меня есть <column name="transactions" type="bigint[]"/> а fk должен быть у него с <column name="transaction_id" type="bigint" autoIncrement="true"> <constraints primaryKey="true"/> </column>
TremorI000Профи (747) 1 год назад
возможно, использовать EACH ELEMENT? Но как это написать в ликвибейзе?
Сергей ЗоринПрофи (979) 1 год назад
Для связывания каждого элемента в bigint[id...id] с bigint id в Liquibase changelog xml можно использовать each элемент следующим образом:

```
<changeSet id="123" author="author">
<createTable tableName="my_table">
<column name="id" type="bigint" autoIncrement="true">
<constraints primaryKey="true"/>
</column>
<column name="transactions" type="bigint[]"/>
</createTable>
<addForeignKeyConstraint baseColumnNames="transaction_id" baseTableName="my_table" constraintName="fk_my_table"
referencedColumnNames="id" referencedTableName="my_table"
each="true"/>
</changeSet>
Сергей Зорин Профи (979) ``` Здесь используется addForeignKeyConstraint для создания внешнего ключа, который связывает каждый элемент в столбце transactions с столбцом id в той же таблице. Параметр each устанавливается в true, чтобы каждый элемент был связан с отдельным значением id.
Сергей ЗоринПрофи (979) 1 год назад
Относительно заданной таблицы, fk должен быть у столбца с именем "transactions", а не у столбца с именем "transaction_id".
Например:
<changeSet id="123" author="author">
<createTable tableName="my_table">
<column name="id" type="bigint" autoIncrement="true">
<constraints primaryKey="true"/>
</column>
<column name="transactions" type="bigint[]"/>
<addForeignKeyConstraint baseColumnNames="transactions" baseTableName="my_table" constraintName="fk_my_table"
referencedColumnNames="id" referencedTableName="my_table"
each="true"/>







</createTable>







</changeSet>



```
Похожие вопросы