2017-05-27 296 views
1

我將Liquibase遷移作爲我的Spring Boot應用程序的一部分來初始化我的數據庫。出於開發目的,在H2內存數據庫下,Liquibase已經完成了遷移,沒有任何問題。然而,當我運行它針對PostgreSQL數據庫,Liquibase無法遷移爲PostgreSQL的返回方式如下:由於PostgreSQL數據庫中的「重複」索引,Liquibase無法執行遷移

Caused by: org.postgresql.util.PSQLException: ERROR: relation "idx_channel_id" already exists

需要注意的是在其上應用索引的表是全新的,並且沒有其他指標與Liquibase遷移文件中的相同名稱。如果我刪除這個索引創建,它只是在下一個失敗。如果我刪除索引(或將它們移動到單獨的遷移中,通過調用PostgreSQL數據庫的前提條件排除它們),遷移將成功,但根本沒有索引。

我一直在抓我的頭在這一個,我卡住了。全Liquibase遷移如下:

databaseChangeLog: 
    - changeSet: 
     id: 1 
     author: rmorrison 
     changes: 
     - createTable: 
      tableName: shouts 
      columns: 
       - column: 
        name: id 
        type: bigint 
        autoIncrement: true 
        constraints: 
        primaryKey: true 
        nullable: false 
       - column: 
        name: discord_id 
        type: varchar(18) 
        constraints: 
        nullable: false 
       - column: 
        name: author_id 
        type: varchar(18) 
        constraints: 
        nullable: false 
       - column: 
        name: channel_id 
        type: varchar(18) 
        constraints: 
        nullable: false 
       - column: 
        name: guild_nickname 
        type: varchar(255) 
        constraints: 
        nullable: false 
       - column: 
        name: content 
        type: varchar(2000) 
        constraints: 
        nullable: false 
       - column: 
        name: created 
        type: blob 
        constraints: 
        nullable: false 
     - createTable: 
      tableName: contexts 
      columns: 
       - column: 
        name: id 
        type: bigint 
        autoIncrement: true 
        constraints: 
        primaryKey: true 
        nullable: false 
       - column: 
        name: discord_id 
        type: varchar(18) 
        constraints: 
        nullable: false 
       - column: 
        name: author_id 
        type: varchar(18) 
        constraints: 
        nullable: false 
       - column: 
        name: guild_nickname 
        type: varchar(255) 
        constraints: 
        nullable: false 
       - column: 
        name: content 
        type: varchar(2000) 
        constraints: 
        nullable: false 
       - column: 
        name: created 
        type: blob 
        constraints: 
        nullable: false 
     - createTable: 
      tableName: shouts_contexts 
      columns: 
       - column: 
        name: shout_id 
        type: bigint 
        constraints: 
        nullable: false 
       - column: 
        name: context_id 
        type: bigint 
        constraints: 
        nullable: false 
     - createIndex: 
      indexName: idx_channel_id 
      tableName: shouts 
      unique: false 
      columns: 
       - column: 
        name: channel_id 
        type: varchar(18) 
     - createIndex: 
      indexName: idx_author_channel_id 
      tableName: shouts 
      unique: false 
      columns: 
       - column: 
        name: author_id 
        type: varchar(18) 
       - column: 
        name: channel_id 
        type: varchar(18) 
     - createIndex: 
      indexName: idx_content 
      tableName: shouts 
      unique: true 
      columns: 
       - column: 
        name: content 
        type: varchar(2000) 

編輯:我重新配置的PostgreSQL,使語句記錄,我現在看到這個了 - 看起來這可能不是終究Liquibase。繼續調查...

< 2017-05-27 19:13:19.697 EDT > LOG: execute <unnamed>: BEGIN 
< 2017-05-27 19:13:19.698 EDT > LOG: execute <unnamed>: CREATE TABLE public.shouts (id BIGSERIAL NOT NULL, discord_id VARCHAR(18) NOT NULL, author_id VARCHAR(18) NOT NULL, channel_id VARCHAR(18) NOT NULL, guild_nickname VARCHAR(255) NOT NULL, content VARCHAR(2000) NOT NULL, created OID NOT NULL, CONSTRAINT PK_SHOUTS PRIMARY KEY (id)) 
< 2017-05-27 19:13:19.718 EDT > LOG: execute <unnamed>: CREATE TABLE public.contexts (id BIGSERIAL NOT NULL, discord_id VARCHAR(18) NOT NULL, author_id VARCHAR(18) NOT NULL, guild_nickname VARCHAR(255) NOT NULL, content VARCHAR(2000) NOT NULL, created OID NOT NULL, CONSTRAINT PK_CONTEXTS PRIMARY KEY (id)) 
< 2017-05-27 19:13:19.725 EDT > LOG: execute <unnamed>: CREATE TABLE public.shouts_contexts (shout_id BIGINT NOT NULL, context_id BIGINT NOT NULL) 
< 2017-05-27 19:13:19.727 EDT > LOG: execute <unnamed>: CREATE INDEX idx_channel_id ON public.shouts(channel_id) 
< 2017-05-27 19:13:19.727 EDT > ERROR: relation "idx_channel_id" already exists 
< 2017-05-27 19:13:19.727 EDT > STATEMENT: CREATE INDEX idx_channel_id ON public.shouts(channel_id) 
< 2017-05-27 19:13:19.741 EDT > LOG: execute S_1: ROLLBACK 

回答

1

我解決了這個問題。事實證明,PostgreSQL要求索引名稱在表中是唯一的。我有一個具有相同索引名稱的舊數據的「備份」表導致衝突。我刪除了違規表,遷移成功,現在沒有問題。