【问题标题】:liquibase - create index for postgresql foreign keysliquibase - 为 postgresql 外键创建索引
【发布时间】:2017-04-27 14:21:31
【问题描述】:

我们正在使用 liquibase 变更集来支持 MySQL 和 PostgreSQL 的使用;现在我偶然发现 MySQL 会自动为外键创建索引,而 postgres 不会。

问题:无论实际使用的是哪个数据库,如何确保数据库架构具有所有外键的索引?

28.02.2017 更新 这是 liquibase 论坛中问题的链接:http://forum.liquibase.org/#Topic/49382000001637005

【问题讨论】:

    标签: mysql postgresql indexing foreign-keys liquibase


    【解决方案1】:

    我将使用 CustomChange-Command 解决此问题:

    public class AddForeignKeyConstraintWithIndex extends
    liquibase.change.core.AddForeignKeyConstraintChange implements
    liquibase.change.custom.CustomSqlChange {
    
    @SuppressWarnings({"UnusedDeclaration", "FieldCanBeLocal"})
    private ResourceAccessor resourceAccessor;
    
    @Override
    public void setUp() throws SetupException {
    }
    
    @Override
    public void setFileOpener(ResourceAccessor resourceAccessor) {
        this.resourceAccessor = resourceAccessor;
    }
    
    @Override
    public SqlStatement[] generateStatements(Database database) {
        SqlStatement[] result = super.generateStatements(database);
        // Für Postgres zusätzlich Index anlegen
        if (database instanceof PostgresDatabase) {
            AddColumnConfig columnConfig = new AddColumnConfig();
            columnConfig.setName(getBaseColumnNames());
            columnConfig.setComputed(Boolean.FALSE);
    
            SqlStatement createIndexStatement = new CreateIndexStatement(
                    "ix_" + getConstraintName(),
                    getBaseTableCatalogName(),
                    getBaseTableSchemaName(),
                    getBaseTableName(),
                    Boolean.FALSE,
                    null,
                    columnConfig
            );
            List<SqlStatement> list = new ArrayList<>(Arrays.asList(result));
            list.add(createIndexStatement);
    
            return list.toArray(new SqlStatement[list.size()]);
    
        }
        return result;
    }
    

    然后您可以这样调用 CustomChange(使用与 AddForeignKeyConstraint-statement 完全相同的参数):

    <customChange
    class="eu.***.***.AddForeignKeyConstraintWithIndex"
            baseTableName="tbl_interest_reference"
            baseColumnNames="customer_id"
            constraintName="finterest_ref_customer_fk"
            referencedTableName="tbl_customer"
            referencedColumnNames="customer_id"
        />
    

    【讨论】:

      【解决方案2】:

      在此处查看“dbms”前提条件:http://www.liquibase.org/documentation/preconditions.html。您可以将所有 postgesql 特定的代码放在那里。

      【讨论】:

      • 感谢您指出前提条件。但是,这似乎是一个曲折的解决方案,因为我必须在那里手动为 postgres 创建所有缺少的索引。另外,对于将要引入的每一个新外键,都必须记住创建这样一个 postgres 特定的变更集。
      • RDBMS 可移植性的另一个缺点。
      • @SebastianRiemer 是的,我同意。刚刚看到有自定义更改标签:liquibase.org/documentation/changes/custom_change.html。因此,如果您熟悉 Java,您可以尝试构建 myForeignKey 标记,该标记将检查数据库供应商并在需要时生成查询以创建索引。
      猜你喜欢
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      相关资源
      最近更新 更多