Liquibase 创建外键时出错 - 关系“person”不存在

问题描述 投票:0回答:1

使用 liquibase 变更集,在创建表时尝试创建外键时收到错误。如果我对 postgres 数据库运行相同的查询,它会很好地创建表。

这是变更集

databaseChangeLog:
  - changeSet:
      id: create_address
      author: m
      labels: create
      context: main
      comment: Create address table
      changes:
        - createTable:
            schemaName: public
            tableName: ADDRESS
            columns:
              - column:
                  name: ID
                  type: int
                  autoIncrement: true
                  constraints:
                    primaryKey: true
                    nullable: false
              - column:
                  name: STREET
                  type: varchar(250)
                  constraints:
                    nullable: false
              - column:
                  name: STREET2
                  type: varchar(250)
                  constraints:
                    nullable:true
              - column:
                  name: CITY
                  type: varchar(50)
                  constraints:
                    nullable: false
              - column:
                  name: STATE_PROVINCE
                  type: varchar(50)
                  constraints:
                    nullable: false
              - column:
                  name: COUNTRY
                  type: varchar(50)
                  constraints:
                    nullable: false
              - column:
                  name: POSTAL_CODE
                  type: varchar(30)
                  constraints:
                    nullable: false
              - column:
                  name: ACTIVE
                  type: boolean
                  constraints:
                    nullable: false
                  defaultValue: true
              - column:
                  name: PERSON_ID
                  type: int
                  constraints:
                    nullable: false
                    foreignKeyName: FK_ADDRESS_PERSON
                    references: person(ID)
              - column:
                  name: CREATED
                  type: timestamp
                  defaultValueComputed: CURRENT_TIMESTAMP
              - column:
                  name: MODIFIED
                  type: timestamp
                  defaultValueComputed: CURRENT_TIMESTAMP
              - column:
                  name: RECORD_TYPE
                  type: varchar(50)
                  constraints:
                    nullable: false
              - column:
                  name: NOTE
                  type: varchar(50)

这是 sql 的错误消息:

Caused by: liquibase.exception.DatabaseException: ERROR: relation "person" does not exist [Failed SQL: (0) CREATE TABLE public.ADDRESS (ID INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL, STREET VARCHAR(250) NOT NULL, STREET2 VARCHAR(250), CITY VARCHAR(50) NOT NULL, STATE_PROVINCE VARCHAR(50) NOT NULL, COUNTRY VARCHAR(50) NOT NULL, POSTAL_CODE VARCHAR(30) NOT NULL, ACTIVE BOOLEAN DEFAULT TRUE NOT NULL, PERSON_ID INTEGER NOT NULL, CREATED TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(), MODIFIED TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(), RECORD_TYPE VARCHAR(50) NOT NULL, NOTE VARCHAR(50), CONSTRAINT "ADDRESS_pkey" PRIMARY KEY (ID), CONSTRAINT FK_ADDRESS_PERSON FOREIGN KEY (PERSON_ID) REFERENCES person(ID))]

如果我在 pgpadmin 中运行相同的 sql,它会毫无问题地创建表

CREATE TABLE public.ADDRESS 
    (ID INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL, 
    STREET VARCHAR(250) NOT NULL, 
    STREET2 VARCHAR(250), 
    CITY VARCHAR(50) NOT NULL, 
    STATE_PROVINCE VARCHAR(50) NOT NULL, 
    COUNTRY VARCHAR(50) NOT NULL, 
    POSTAL_CODE VARCHAR(30) NOT NULL, 
    ACTIVE BOOLEAN DEFAULT TRUE NOT NULL, 
    PERSON_ID INTEGER NOT NULL, 
    CREATED TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(), 
    MODIFIED TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(), 
    RECORD_TYPE VARCHAR(50) NOT NULL, NOTE VARCHAR(50), 
    CONSTRAINT "ADDRESS_pkey" PRIMARY KEY (ID), 
    CONSTRAINT FK_ADDRESS_PERSON FOREIGN KEY (PERSON_ID) REFERENCES PERSON(ID))


CREATE TABLE

Query returned successfully in 25 msec.

我更改了 liquibase 和 pgpadmin 中引用表的大小写,并得到了相同的结果。

请参阅上面的代码和结果

postgresql foreign-keys liquibase changeset
1个回答
0
投票

感谢您的回复。如果我取出外键约束,变更集将运行。因此,考虑到这一点,在创建表并起作用后,我将外键约束创建移至其自己的变更集。它有点笨拙,但它运行起来并创建了约束。我不会说这是一个解决方案,但它是一种解决方法,并且适用于我当前正在工作的工作。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.