Liquibase:如何在列标记中设置外键约束?

Ari*_*Ari 40 java liquibase gradle

如何配置通过列标签属性外键foreignKeyNamereferences?我发现的唯一例子演示了如何在事后添加外键.

Nat*_*and 54

<constraints>在列标记中使用嵌套标记.

例:

<changeSet id="SAMPLE_1" author="alice">
    <createTable tableName="employee">
        <column name="id" type="int" autoIncrement="true">
            <constraints primaryKey="true"/>
        </column>
        <column name="first_name" type="varchar(255)"/>
        <column name="last_name" type="varchar(255)">
            <constraints nullable="false"/>
        </column>
    </createTable>
</changeSet>

<changeSet id="create address table" author="bob">
    <createTable tableName="address">
        <column name="id" type="int" autoIncrement="true">
            <constraints primaryKey="true"/>
        </column>
        <column name="line1" type="varchar(255)">
            <constraints nullable="false"/>
        </column>
        <column name="line2" type="varchar(255)"/>
        <column name="city" type="varchar(100)">
            <constraints nullable="false"/>
        </column>
        <column name="employee_id" type="int">
            <constraints nullable="false" foreignKeyName="fk_address_employee" references="employee(id)"/>
        </column>
    </createTable>
</changeSet>
Run Code Online (Sandbox Code Playgroud)

  • 知道`references ="employee(id)"`语法在哪里?`references`被定义为["外键定义"](http://www.liquibase.org/documentation/column.html)但谷歌将大多数查询引导到`addForeignKeyConstraint`,这不是最好的方式.你正在创建一个表或添加列,并且已经有了`<column>`标签. (5认同)
  • 使用上面的语法对我不起作用,它生成了以下`REFERENCES null(null))`.而不是`references ="employee(id)"`我不得不使用`referencedTableName ="employee"referencedColumnNames ="id"` (5认同)
  • 查看最新的XSD以确保您使用正确的语法.您可以在liquibase-core-(version).jar中找到它:liquibase/parser/core/xml/dbchangelog-(version).xsd.使用XML而不是YAML/JSON的一个优点是,使用正确的XML命名空间和IDE,您可以自动完成可用属性.*很有帮助. (4认同)
  • 知道如何在YAML中做到这一点吗?我担心Liquibase文档总是让我想要,丢失或两者兼而有之. (3认同)

ank*_*kit 20

您必须添加外部约束,例如:

- changeSet:
    id: create_account_table
    author: ankit
    changes:
    - createTable:
        tableName: account
        columns:
        - column:
            name: accn_id
            type: uuid
            constraints:
              primaryKey: true
              primaryKeyName: pk_account
- changeSet:
    id: create_table_abc
    author: ankit
    changes:
    - createTable:
        tableName: abc
        columns:
        - column:
            name: id
            type: uuid
            constraints:
              primaryKey: true
              primaryKeyName: pk_abc
        - column:
            name: accn_id
            type: UUID
            constraints:
              nullable: false
              foreignKeyName: fk_abc_account
              references: account(accn_id)
Run Code Online (Sandbox Code Playgroud)


小智 5

也许您可以添加如下外键:

<changeSet id="1" author="ozhanli">
    <!--
    Owner Entity.
    -->
    <createTable tableName="owner">
        <column name="id" type="bigint" autoIncrement="true">
            <constraints primaryKey="true" nullable="false"/>
        </column>
        <column name="name" type="varchar(255)">
            <constraints nullable="true" />
        </column>
    </createTable>

    <!--
    Car Entity.
    -->
    <createTable tableName="car">
        <column name="id" type="bigint" autoIncrement="true">
            <constraints primaryKey="true" nullable="false"/>
        </column>
        <column name="brand" type="varchar(255)">
            <constraints nullable="true" />
        </column>
        <column name="owner_id" type="bigint">
            <constraints nullable="true" />
        </column>
    </createTable>

    <!--
    Constraints for Car entity
    -->
    <addForeignKeyConstraint baseColumnNames="owner_id"
                             baseTableName="car"
                             constraintName="fk_car_owner_id"
                             referencedColumnNames="id"
                             referencedTableName="owner"/>
</changeSet>
Run Code Online (Sandbox Code Playgroud)